{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:17:31.663323Z",
     "start_time": "2021-01-21T08:17:31.655344Z"
    }
   },
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Linear Regression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:39:48.892091Z",
     "start_time": "2021-01-21T07:39:47.929664Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression as LR\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.model_selection import cross_val_score\n",
    "from sklearn.datasets import fetch_california_housing as fch #加利福尼亚房屋价值数据集\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  导入数据，探索数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:40:45.038024Z",
     "start_time": "2021-01-21T07:40:45.020072Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'\\nMedInc：该街区住户的收入中位数\\nHouseAge：该街区房屋使用年代的中位数\\nAveRooms：该街区平均的房间数目\\nAveBedrms：该街区平均的卧室数目\\nPopulation：街区人口\\nAveOccup：平均入住率\\nLatitude：街区的纬度\\nLongitude：街区的经度\\n'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "housevalue = fch() #会需要下载，大家可以提前运行试试看\n",
    "X = pd.DataFrame(housevalue.data) #放入DataFrame中便于查看\n",
    "y = housevalue.target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:40:46.608830Z",
     "start_time": "2021-01-21T07:40:46.591876Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(20640, 8)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:40:47.207231Z",
     "start_time": "2021-01-21T07:40:47.200250Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(20640,)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:40:47.780698Z",
     "start_time": "2021-01-21T07:40:47.759754Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>8.3252</td>\n",
       "      <td>41.0</td>\n",
       "      <td>6.984127</td>\n",
       "      <td>1.023810</td>\n",
       "      <td>322.0</td>\n",
       "      <td>2.555556</td>\n",
       "      <td>37.88</td>\n",
       "      <td>-122.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8.3014</td>\n",
       "      <td>21.0</td>\n",
       "      <td>6.238137</td>\n",
       "      <td>0.971880</td>\n",
       "      <td>2401.0</td>\n",
       "      <td>2.109842</td>\n",
       "      <td>37.86</td>\n",
       "      <td>-122.22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>7.2574</td>\n",
       "      <td>52.0</td>\n",
       "      <td>8.288136</td>\n",
       "      <td>1.073446</td>\n",
       "      <td>496.0</td>\n",
       "      <td>2.802260</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5.6431</td>\n",
       "      <td>52.0</td>\n",
       "      <td>5.817352</td>\n",
       "      <td>1.073059</td>\n",
       "      <td>558.0</td>\n",
       "      <td>2.547945</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3.8462</td>\n",
       "      <td>52.0</td>\n",
       "      <td>6.281853</td>\n",
       "      <td>1.081081</td>\n",
       "      <td>565.0</td>\n",
       "      <td>2.181467</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.25</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        0     1         2         3       4         5      6       7\n",
       "0  8.3252  41.0  6.984127  1.023810   322.0  2.555556  37.88 -122.23\n",
       "1  8.3014  21.0  6.238137  0.971880  2401.0  2.109842  37.86 -122.22\n",
       "2  7.2574  52.0  8.288136  1.073446   496.0  2.802260  37.85 -122.24\n",
       "3  5.6431  52.0  5.817352  1.073059   558.0  2.547945  37.85 -122.25\n",
       "4  3.8462  52.0  6.281853  1.081081   565.0  2.181467  37.85 -122.25"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:40:48.642395Z",
     "start_time": "2021-01-21T07:40:48.624443Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['MedInc',\n",
       " 'HouseAge',\n",
       " 'AveRooms',\n",
       " 'AveBedrms',\n",
       " 'Population',\n",
       " 'AveOccup',\n",
       " 'Latitude',\n",
       " 'Longitude']"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"\"\"\n",
    "MedInc：该街区住户的收入中位数\n",
    "HouseAge：该街区房屋使用年代的中位数\n",
    "AveRooms：该街区平均的房间数目\n",
    "AveBedrms：该街区平均的卧室数目\n",
    "Population：街区人口\n",
    "AveOccup：平均入住率\n",
    "Latitude：街区的纬度\n",
    "Longitude：街区的经度\n",
    "\"\"\"\n",
    "housevalue.feature_names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:40:51.288323Z",
     "start_time": "2021-01-21T07:40:51.284333Z"
    }
   },
   "outputs": [],
   "source": [
    "X.columns = housevalue.feature_names"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分训练集和测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:41:30.636145Z",
     "start_time": "2021-01-21T07:41:30.621185Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(14448, 8)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420)\n",
    "for i in [Xtrain, Xtest]:\n",
    "    i.index = range(i.shape[0])\n",
    "Xtrain.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 建模"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:41:49.336929Z",
     "start_time": "2021-01-21T07:41:49.313991Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.51384887, 0.46566247, 2.2567733 , ..., 2.11885803, 1.76968187,\n",
       "       0.73219077])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg = LR().fit(Xtrain, Ytrain)\n",
    "yhat = reg.predict(Xtest)\n",
    "yhat"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 探索建好的模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:42:15.740288Z",
     "start_time": "2021-01-21T07:42:15.725328Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('MedInc', 0.43735893059683967),\n",
       " ('HouseAge', 0.010211268294493939),\n",
       " ('AveRooms', -0.1078072161731765),\n",
       " ('AveBedrms', 0.6264338275363768),\n",
       " ('Population', 5.216125353230231e-07),\n",
       " ('AveOccup', -0.0033485096463335773),\n",
       " ('Latitude', -0.41309593789477234),\n",
       " ('Longitude', -0.42621095362084704)]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[*zip(Xtrain.columns,reg.coef_)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:42:30.410075Z",
     "start_time": "2021-01-21T07:42:30.405089Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-36.25689322920386"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg.intercept_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 回归类的模型评估指标"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 是否预测了正确的数值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:43:39.693879Z",
     "start_time": "2021-01-21T07:43:39.688892Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5309012639324571"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import mean_squared_error as MSE\n",
    "MSE(yhat,Ytest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:43:40.625388Z",
     "start_time": "2021-01-21T07:43:40.610429Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.00001"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:43:41.241741Z",
     "start_time": "2021-01-21T07:43:41.226781Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.14999"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:44:41.843752Z",
     "start_time": "2021-01-21T07:44:41.836770Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['accuracy',\n",
       " 'adjusted_mutual_info_score',\n",
       " 'adjusted_rand_score',\n",
       " 'average_precision',\n",
       " 'balanced_accuracy',\n",
       " 'completeness_score',\n",
       " 'explained_variance',\n",
       " 'f1',\n",
       " 'f1_macro',\n",
       " 'f1_micro',\n",
       " 'f1_samples',\n",
       " 'f1_weighted',\n",
       " 'fowlkes_mallows_score',\n",
       " 'homogeneity_score',\n",
       " 'jaccard',\n",
       " 'jaccard_macro',\n",
       " 'jaccard_micro',\n",
       " 'jaccard_samples',\n",
       " 'jaccard_weighted',\n",
       " 'max_error',\n",
       " 'mutual_info_score',\n",
       " 'neg_brier_score',\n",
       " 'neg_log_loss',\n",
       " 'neg_mean_absolute_error',\n",
       " 'neg_mean_gamma_deviance',\n",
       " 'neg_mean_poisson_deviance',\n",
       " 'neg_mean_squared_error',\n",
       " 'neg_mean_squared_log_error',\n",
       " 'neg_median_absolute_error',\n",
       " 'neg_root_mean_squared_error',\n",
       " 'normalized_mutual_info_score',\n",
       " 'precision',\n",
       " 'precision_macro',\n",
       " 'precision_micro',\n",
       " 'precision_samples',\n",
       " 'precision_weighted',\n",
       " 'r2',\n",
       " 'recall',\n",
       " 'recall_macro',\n",
       " 'recall_micro',\n",
       " 'recall_samples',\n",
       " 'recall_weighted',\n",
       " 'roc_auc',\n",
       " 'roc_auc_ovo',\n",
       " 'roc_auc_ovo_weighted',\n",
       " 'roc_auc_ovr',\n",
       " 'roc_auc_ovr_weighted',\n",
       " 'v_measure_score']"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#为什么报错了？来试试看！\n",
    "import sklearn\n",
    "sorted(sklearn.metrics.SCORERS.keys())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:44:57.559742Z",
     "start_time": "2021-01-21T07:44:57.485939Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.48922052, -0.43335865, -0.8864377 , -0.39091641, -0.7479731 ,\n",
       "       -0.52980278, -0.28798456, -0.77326441, -0.64305557, -0.3275106 ])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross_val_score(reg,X,y,cv=10,scoring=\"neg_mean_squared_error\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:47:58.143414Z",
     "start_time": "2021-01-21T07:47:58.061633Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5110068610524554"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#调用R2\n",
    "from sklearn.metrics import r2_score\n",
    "r2_score(y_true = Ytest,y_pred=yhat)\n",
    "cross_val_score(reg,X,y,cv=10,scoring=\"r2\").mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:46:51.197359Z",
     "start_time": "2021-01-21T07:46:51.181402Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6043668160178817"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r2 = reg.score(Xtest,Ytest)\n",
    "r2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T07:49:07.235748Z",
     "start_time": "2021-01-21T07:49:06.902639Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "sorted(Ytest)\n",
    "plt.plot(range(len(Ytest)),sorted(Ytest),c=\"black\",label= \"Data\")\n",
    "plt.plot(range(len(yhat)),sorted(yhat),c=\"red\",label = \"Predict\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### linear_model.Ridge"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:01:38.099692Z",
     "start_time": "2021-01-21T08:01:38.076754Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>住户收入中位数</th>\n",
       "      <th>房屋使用年代中位数</th>\n",
       "      <th>平均房间数目</th>\n",
       "      <th>平均卧室数目</th>\n",
       "      <th>街区人口</th>\n",
       "      <th>平均入住率</th>\n",
       "      <th>街区的纬度</th>\n",
       "      <th>街区的经度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>8.3252</td>\n",
       "      <td>41.0</td>\n",
       "      <td>6.984127</td>\n",
       "      <td>1.023810</td>\n",
       "      <td>322.0</td>\n",
       "      <td>2.555556</td>\n",
       "      <td>37.88</td>\n",
       "      <td>-122.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8.3014</td>\n",
       "      <td>21.0</td>\n",
       "      <td>6.238137</td>\n",
       "      <td>0.971880</td>\n",
       "      <td>2401.0</td>\n",
       "      <td>2.109842</td>\n",
       "      <td>37.86</td>\n",
       "      <td>-122.22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>7.2574</td>\n",
       "      <td>52.0</td>\n",
       "      <td>8.288136</td>\n",
       "      <td>1.073446</td>\n",
       "      <td>496.0</td>\n",
       "      <td>2.802260</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5.6431</td>\n",
       "      <td>52.0</td>\n",
       "      <td>5.817352</td>\n",
       "      <td>1.073059</td>\n",
       "      <td>558.0</td>\n",
       "      <td>2.547945</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3.8462</td>\n",
       "      <td>52.0</td>\n",
       "      <td>6.281853</td>\n",
       "      <td>1.081081</td>\n",
       "      <td>565.0</td>\n",
       "      <td>2.181467</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.25</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   住户收入中位数  房屋使用年代中位数    平均房间数目    平均卧室数目    街区人口     平均入住率  街区的纬度   街区的经度\n",
       "0   8.3252       41.0  6.984127  1.023810   322.0  2.555556  37.88 -122.23\n",
       "1   8.3014       21.0  6.238137  0.971880  2401.0  2.109842  37.86 -122.22\n",
       "2   7.2574       52.0  8.288136  1.073446   496.0  2.802260  37.85 -122.24\n",
       "3   5.6431       52.0  5.817352  1.073059   558.0  2.547945  37.85 -122.25\n",
       "4   3.8462       52.0  6.281853  1.081081   565.0  2.181467  37.85 -122.25"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.linear_model import Ridge, LinearRegression, Lasso\n",
    "from sklearn.model_selection import train_test_split as TTS\n",
    "from sklearn.datasets import fetch_california_housing as fch\n",
    "import matplotlib.pyplot as plt\n",
    "housevalue = fch()\n",
    "X = pd.DataFrame(housevalue.data)\n",
    "y = housevalue.target\n",
    "X.columns = [\"住户收入中位数\",\"房屋使用年代中位数\",\"平均房间数目\"\n",
    ",\"平均卧室数目\",\"街区人口\",\"平均入住率\",\"街区的纬度\",\"街区的经度\"]\n",
    "X.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:01:39.583726Z",
     "start_time": "2021-01-21T08:01:39.573752Z"
    }
   },
   "outputs": [],
   "source": [
    "Xtrain,Xtest,Ytrain,Ytest = TTS(X,y,test_size=0.3,random_state=420)\n",
    "#数据集索引恢复\n",
    "for i in [Xtrain,Xtest]:\n",
    "    i.index = range(i.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:01:40.434452Z",
     "start_time": "2021-01-21T08:01:40.413508Z"
    }
   },
   "outputs": [],
   "source": [
    "#使用岭回归来进行建模\n",
    "reg = Ridge(alpha=1).fit(Xtrain,Ytrain)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:01:45.492285Z",
     "start_time": "2021-01-21T08:01:45.481314Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.604361035231228"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg.score(Xtest,Ytest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:02:10.771737Z",
     "start_time": "2021-01-21T08:02:10.070611Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#交叉验证下，与线性回归相比，岭回归的结果如何变化？\n",
    "alpharange = np.arange(1,1001,100)\n",
    "ridge, lr = [], []\n",
    "for alpha in alpharange:\n",
    "    reg = Ridge(alpha=alpha)\n",
    "    linear = LinearRegression()\n",
    "    regs = cross_val_score(reg,X,y,cv=5,scoring = \"r2\").mean()\n",
    "    linears = cross_val_score(linear,X,y,cv=5,scoring = \"r2\").mean()\n",
    "    ridge.append(regs)\n",
    "    lr.append(linears)\n",
    "plt.plot(alpharange,ridge,color=\"red\",label=\"Ridge\")\n",
    "plt.plot(alpharange,lr,color=\"orange\",label=\"LR\")\n",
    "plt.title(\"Mean\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:02:20.017024Z",
     "start_time": "2021-01-21T08:02:18.750410Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#细化一下学习曲线\n",
    "alpharange = np.arange(1,201,10)\n",
    "ridge, lr = [], []\n",
    "for alpha in alpharange:\n",
    "    reg = Ridge(alpha=alpha)\n",
    "    linear = LinearRegression()\n",
    "    regs = cross_val_score(reg,X,y,cv=5,scoring = \"r2\").mean()\n",
    "    linears = cross_val_score(linear,X,y,cv=5,scoring = \"r2\").mean()\n",
    "    ridge.append(regs)\n",
    "    lr.append(linears)\n",
    "plt.plot(alpharange,ridge,color=\"red\",label=\"Ridge\")\n",
    "plt.plot(alpharange,lr,color=\"orange\",label=\"LR\")\n",
    "plt.title(\"Mean\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:02:44.548451Z",
     "start_time": "2021-01-21T08:02:43.860291Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#模型方差如何变化？\n",
    "alpharange = np.arange(1,1001,100)\n",
    "ridge, lr = [], []\n",
    "for alpha in alpharange:\n",
    "    reg = Ridge(alpha=alpha)\n",
    "    linear = LinearRegression()\n",
    "    varR = cross_val_score(reg,X,y,cv=5,scoring=\"r2\").var()\n",
    "    varLR = cross_val_score(linear,X,y,cv=5,scoring=\"r2\").var()\n",
    "    ridge.append(varR)\n",
    "    lr.append(varLR)\n",
    "plt.plot(alpharange,ridge,color=\"red\",label=\"Ridge\")\n",
    "plt.plot(alpharange,lr,color=\"orange\",label=\"LR\")\n",
    "plt.title(\"Variance\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:15:33.956846Z",
     "start_time": "2021-01-21T08:15:33.254723Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.datasets import load_boston\n",
    "from sklearn.model_selection import cross_val_score\n",
    "X = load_boston().data\n",
    "y = load_boston().target\n",
    "Xtrain,Xtest,Ytrain,Ytest = TTS(X,y,test_size=0.3,random_state=420)\n",
    "\n",
    "#先查看方差的变化\n",
    "alpharange = np.arange(1,1001,100)\n",
    "ridge, lr = [], []\n",
    "for alpha in alpharange:\n",
    "    reg = Ridge(alpha=alpha)\n",
    "    linear = LinearRegression()\n",
    "    varR = cross_val_score(reg,X,y,cv=5,scoring=\"r2\").var()\n",
    "    varLR = cross_val_score(linear,X,y,cv=5,scoring=\"r2\").var()\n",
    "    ridge.append(varR)\n",
    "    lr.append(varLR)\n",
    "plt.plot(alpharange,ridge,color=\"red\",label=\"Ridge\")\n",
    "plt.plot(alpharange,lr,color=\"orange\",label=\"LR\")\n",
    "plt.title(\"Variance\")\n",
    "plt.legend()\n",
    "plt.show()\n",
    "#查看R2的变化\n",
    "alpharange = np.arange(1,1001,100)\n",
    "ridge, lr = [], []\n",
    "for alpha in alpharange:\n",
    "    reg = Ridge(alpha=alpha)\n",
    "    linear = LinearRegression()\n",
    "    regs = cross_val_score(reg,X,y,cv=5,scoring = \"r2\").mean()\n",
    "    linears = cross_val_score(linear,X,y,cv=5,scoring = \"r2\").mean()\n",
    "    ridge.append(regs)\n",
    "    lr.append(linears)\n",
    "plt.plot(alpharange,ridge,color=\"red\",label=\"Ridge\")\n",
    "plt.plot(alpharange,lr,color=\"orange\",label=\"LR\")\n",
    "plt.title(\"Mean\")\n",
    "plt.legend()\n",
    "plt.show()\n",
    "#细化学习曲线\n",
    "alpharange = np.arange(100,300,10)\n",
    "ridge, lr = [], []\n",
    "for alpha in alpharange:\n",
    "    reg = Ridge(alpha=alpha)\n",
    "#     linear = LinearRegression()\n",
    "    regs = cross_val_score(reg,X,y,cv=5,scoring = \"r2\").mean()\n",
    "#     linears = cross_val_score(linear,X,y,cv=5,scoring = \"r2\").mean()\n",
    "    ridge.append(regs)\n",
    "    lr.append(linears)\n",
    "plt.plot(alpharange,ridge,color=\"red\",label=\"Ridge\")\n",
    "# plt.plot(alpharange,lr,color=\"orange\",label=\"LR\")\n",
    "plt.title(\"Mean\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 选取最佳的正则化参数取值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:16:59.985996Z",
     "start_time": "2021-01-21T08:16:59.968044Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn import linear_model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:17:36.474462Z",
     "start_time": "2021-01-21T08:17:36.226126Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#创造10*10的希尔伯特矩阵\n",
    "X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])\n",
    "y = np.ones(10)\n",
    "#计算横坐标\n",
    "n_alphas = 200\n",
    "alphas = np.logspace(-10, -2, n_alphas)\n",
    "#建模，获取每一个正则化取值下的系数组合\n",
    "coefs = []\n",
    "for a in alphas:\n",
    "    ridge = linear_model.Ridge(alpha=a, fit_intercept=False)\n",
    "    ridge.fit(X, y)\n",
    "    coefs.append(ridge.coef_)\n",
    "    \n",
    "#绘图展示结果\n",
    "ax = plt.gca()\n",
    "ax.plot(alphas, coefs)\n",
    "ax.set_xscale('log')\n",
    "ax.set_xlim(ax.get_xlim()[::-1]) #将横坐标逆转\n",
    "plt.xlabel('正则化参数alpha')\n",
    "plt.ylabel('系数w')\n",
    "plt.title('岭回归下的岭迹图')\n",
    "plt.axis('tight')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:18:30.287619Z",
     "start_time": "2021-01-21T08:18:30.279640Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.        , 0.5       , 0.33333333, 0.25      , 0.2       ,\n",
       "        0.16666667, 0.14285714, 0.125     , 0.11111111, 0.1       ],\n",
       "       [0.5       , 0.33333333, 0.25      , 0.2       , 0.16666667,\n",
       "        0.14285714, 0.125     , 0.11111111, 0.1       , 0.09090909],\n",
       "       [0.33333333, 0.25      , 0.2       , 0.16666667, 0.14285714,\n",
       "        0.125     , 0.11111111, 0.1       , 0.09090909, 0.08333333],\n",
       "       [0.25      , 0.2       , 0.16666667, 0.14285714, 0.125     ,\n",
       "        0.11111111, 0.1       , 0.09090909, 0.08333333, 0.07692308],\n",
       "       [0.2       , 0.16666667, 0.14285714, 0.125     , 0.11111111,\n",
       "        0.1       , 0.09090909, 0.08333333, 0.07692308, 0.07142857],\n",
       "       [0.16666667, 0.14285714, 0.125     , 0.11111111, 0.1       ,\n",
       "        0.09090909, 0.08333333, 0.07692308, 0.07142857, 0.06666667],\n",
       "       [0.14285714, 0.125     , 0.11111111, 0.1       , 0.09090909,\n",
       "        0.08333333, 0.07692308, 0.07142857, 0.06666667, 0.0625    ],\n",
       "       [0.125     , 0.11111111, 0.1       , 0.09090909, 0.08333333,\n",
       "        0.07692308, 0.07142857, 0.06666667, 0.0625    , 0.05882353],\n",
       "       [0.11111111, 0.1       , 0.09090909, 0.08333333, 0.07692308,\n",
       "        0.07142857, 0.06666667, 0.0625    , 0.05882353, 0.05555556],\n",
       "       [0.1       , 0.09090909, 0.08333333, 0.07692308, 0.07142857,\n",
       "        0.06666667, 0.0625    , 0.05882353, 0.05555556, 0.05263158]])"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:18:46.357674Z",
     "start_time": "2021-01-21T08:18:46.346702Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange(1, 11)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:18:47.193438Z",
     "start_time": "2021-01-21T08:18:47.186458Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0],\n",
       "       [1],\n",
       "       [2],\n",
       "       [3],\n",
       "       [4],\n",
       "       [5],\n",
       "       [6],\n",
       "       [7],\n",
       "       [8],\n",
       "       [9]])"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange(0, 10)[:, np.newaxis]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:26:02.914765Z",
     "start_time": "2021-01-21T08:26:02.895815Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10],\n",
       "       [ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11],\n",
       "       [ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12],\n",
       "       [ 4,  5,  6,  7,  8,  9, 10, 11, 12, 13],\n",
       "       [ 5,  6,  7,  8,  9, 10, 11, 12, 13, 14],\n",
       "       [ 6,  7,  8,  9, 10, 11, 12, 13, 14, 15],\n",
       "       [ 7,  8,  9, 10, 11, 12, 13, 14, 15, 16],\n",
       "       [ 8,  9, 10, 11, 12, 13, 14, 15, 16, 17],\n",
       "       [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18],\n",
       "       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:19:27.758024Z",
     "start_time": "2021-01-21T08:19:27.752040Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = np.ones(10)\n",
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:32:15.388386Z",
     "start_time": "2021-01-21T08:32:15.343506Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.linear_model import RidgeCV, LinearRegression\n",
    "from sklearn.model_selection import train_test_split as TTS\n",
    "from sklearn.datasets import fetch_california_housing as fch\n",
    "import matplotlib.pyplot as plt\n",
    "housevalue = fch()\n",
    "X = pd.DataFrame(housevalue.data)\n",
    "y = housevalue.target\n",
    "X.columns = [\"住户收入中位数\",\"房屋使用年代中位数\",\"平均房间数目\"\n",
    ",\"平均卧室数目\",\"街区人口\",\"平均入住率\",\"街区的纬度\",\"街区的经度\"]\n",
    "Ridge_ = RidgeCV(alphas=np.arange(1,1001,100)\n",
    "#,scoring=\"neg_mean_squared_error\"\n",
    ",store_cv_values=True\n",
    "#,cv=5\n",
    ").fit(X, y)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:32:15.802279Z",
     "start_time": "2021-01-21T08:32:15.783330Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.606025176733843"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#无关交叉验证的岭回归结果\n",
    "Ridge_.score(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:32:27.622683Z",
     "start_time": "2021-01-21T08:32:27.607723Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.1557472 , 0.16301246, 0.16892723, ..., 0.18881663, 0.19182353,\n",
       "        0.19466385],\n",
       "       [0.15334566, 0.13922075, 0.12849014, ..., 0.09744906, 0.09344092,\n",
       "        0.08981868],\n",
       "       [0.02429857, 0.03043271, 0.03543001, ..., 0.04971514, 0.05126165,\n",
       "        0.05253834],\n",
       "       ...,\n",
       "       [0.56545783, 0.5454654 , 0.52655917, ..., 0.44532597, 0.43130136,\n",
       "        0.41790336],\n",
       "       [0.27883123, 0.2692305 , 0.25944481, ..., 0.21328675, 0.20497018,\n",
       "        0.19698274],\n",
       "       [0.14313527, 0.13967826, 0.13511341, ..., 0.1078647 , 0.10251737,\n",
       "        0.0973334 ]])"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Ridge_.cv_values_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:32:28.137308Z",
     "start_time": "2021-01-21T08:32:28.127334Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(20640, 10)"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#调用所有交叉验证的结果\n",
    "Ridge_.cv_values_.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:49:06.777845Z",
     "start_time": "2021-01-21T08:49:06.754907Z"
    }
   },
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "'Ridge' object has no attribute 'cv_values_'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-102-83c9c0dbbc09>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[1;31m#进行平均后可以查看每个正则化系数取值下的交叉验证结果\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mRidge_\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcv_values_\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0maxis\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mAttributeError\u001b[0m: 'Ridge' object has no attribute 'cv_values_'"
     ]
    }
   ],
   "source": [
    "#进行平均后可以查看每个正则化系数取值下的交叉验证结果\n",
    "Ridge_.cv_values_.mean(axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:31:07.886807Z",
     "start_time": "2021-01-21T08:31:07.875836Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "101"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#查看被选择出来的最佳正则化系数\n",
    "Ridge_.alpha_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lasso"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Lasso的核心作用：特征选择"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:38:33.357241Z",
     "start_time": "2021-01-21T08:38:33.342281Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.linear_model import Ridge, LinearRegression, Lasso\n",
    "from sklearn.model_selection import train_test_split as TTS"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:38:33.991546Z",
     "start_time": "2021-01-21T08:38:33.957636Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>住户收入中位数</th>\n",
       "      <th>房屋使用年代中位数</th>\n",
       "      <th>平均房间数目</th>\n",
       "      <th>平均卧室数目</th>\n",
       "      <th>街区人口</th>\n",
       "      <th>平均入住率</th>\n",
       "      <th>街区的纬度</th>\n",
       "      <th>街区的经度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>8.3252</td>\n",
       "      <td>41.0</td>\n",
       "      <td>6.984127</td>\n",
       "      <td>1.023810</td>\n",
       "      <td>322.0</td>\n",
       "      <td>2.555556</td>\n",
       "      <td>37.88</td>\n",
       "      <td>-122.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8.3014</td>\n",
       "      <td>21.0</td>\n",
       "      <td>6.238137</td>\n",
       "      <td>0.971880</td>\n",
       "      <td>2401.0</td>\n",
       "      <td>2.109842</td>\n",
       "      <td>37.86</td>\n",
       "      <td>-122.22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>7.2574</td>\n",
       "      <td>52.0</td>\n",
       "      <td>8.288136</td>\n",
       "      <td>1.073446</td>\n",
       "      <td>496.0</td>\n",
       "      <td>2.802260</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5.6431</td>\n",
       "      <td>52.0</td>\n",
       "      <td>5.817352</td>\n",
       "      <td>1.073059</td>\n",
       "      <td>558.0</td>\n",
       "      <td>2.547945</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3.8462</td>\n",
       "      <td>52.0</td>\n",
       "      <td>6.281853</td>\n",
       "      <td>1.081081</td>\n",
       "      <td>565.0</td>\n",
       "      <td>2.181467</td>\n",
       "      <td>37.85</td>\n",
       "      <td>-122.25</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   住户收入中位数  房屋使用年代中位数    平均房间数目    平均卧室数目    街区人口     平均入住率  街区的纬度   街区的经度\n",
       "0   8.3252       41.0  6.984127  1.023810   322.0  2.555556  37.88 -122.23\n",
       "1   8.3014       21.0  6.238137  0.971880  2401.0  2.109842  37.86 -122.22\n",
       "2   7.2574       52.0  8.288136  1.073446   496.0  2.802260  37.85 -122.24\n",
       "3   5.6431       52.0  5.817352  1.073059   558.0  2.547945  37.85 -122.25\n",
       "4   3.8462       52.0  6.281853  1.081081   565.0  2.181467  37.85 -122.25"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import fetch_california_housing as fch\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "housevalue = fch()\n",
    "X = pd.DataFrame(housevalue.data)\n",
    "y = housevalue.target\n",
    "X.columns = [\"住户收入中位数\",\"房屋使用年代中位数\",\"平均房间数目\"\n",
    ",\"平均卧室数目\",\"街区人口\",\"平均入住率\",\"街区的纬度\",\"街区的经度\"]\n",
    "X.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:39:01.180868Z",
     "start_time": "2021-01-21T08:39:01.171892Z"
    }
   },
   "outputs": [],
   "source": [
    "Xtrain,Xtest,Ytrain,Ytest = TTS(X,y,test_size=0.3,random_state=420)\n",
    "#恢复索引\n",
    "for i in [Xtrain,Xtest]:\n",
    "    i.index = range(i.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:39:01.680532Z",
     "start_time": "2021-01-21T08:39:01.659588Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[43.73589305968397,\n",
       " 1.0211268294493938,\n",
       " -10.78072161731765,\n",
       " 62.64338275363768,\n",
       " 5.216125353230231e-05,\n",
       " -0.33485096463335773,\n",
       " -41.30959378947723,\n",
       " -42.6210953620847]"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#线性回归进行拟合\n",
    "reg = LinearRegression().fit(Xtrain,Ytrain)\n",
    "(reg.coef_*100).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:39:57.188203Z",
     "start_time": "2021-01-21T08:39:57.168256Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[43.73575720621587,\n",
       " 1.0211292318121712,\n",
       " -10.78046033625153,\n",
       " 62.64202320775632,\n",
       " 5.217068073239262e-05,\n",
       " -0.3348506517067611,\n",
       " -41.309571432291854,\n",
       " -42.621053889324536]"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#岭回归进行拟合\n",
    "Ridge_ = Ridge(alpha=0.01).fit(Xtrain,Ytrain)\n",
    "(Ridge_.coef_*100).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:39:58.386001Z",
     "start_time": "2021-01-21T08:39:58.151628Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[40.10568371834486,\n",
       " 1.0936292607860136,\n",
       " -3.7423763610244585,\n",
       " 26.52403783489723,\n",
       " 0.00035253685115039385,\n",
       " -0.32071293948877955,\n",
       " -40.064830473448446,\n",
       " -40.81754399163319]"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Lasso进行拟合\n",
    "lasso_ = Lasso(alpha=0.01).fit(Xtrain,Ytrain)\n",
    "(lasso_.coef_*100).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:40:17.540326Z",
     "start_time": "2021-01-21T08:40:17.520380Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[34.62081517607694,\n",
       " 1.5196170869238703,\n",
       " 0.3968610529210182,\n",
       " 0.9151812510354851,\n",
       " 0.0021739238012248472,\n",
       " -0.34768660148101055,\n",
       " -14.736963474215289,\n",
       " -13.43557610252695]"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#加大正则项系数，观察模型的系数发生了什么变化\n",
    "Ridge_ = Ridge(alpha=10**4).fit(Xtrain,Ytrain)\n",
    "(Ridge_.coef_*100).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:40:20.787658Z",
     "start_time": "2021-01-21T08:40:20.775690Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.0, 0.0, 0.0, -0.0, -0.0, -0.0, -0.0, -0.0]"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lasso_ = Lasso(alpha=10**4).fit(Xtrain,Ytrain)\n",
    "(lasso_.coef_*100).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:40:26.685891Z",
     "start_time": "2021-01-21T08:40:26.664950Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[14.581141247629418,\n",
       " 0.6209347344423876,\n",
       " 0.0,\n",
       " -0.0,\n",
       " -0.0002806598632900996,\n",
       " -0.0,\n",
       " -0.0,\n",
       " -0.0]"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#看来10**4对于Lasso来说是一个过于大的取值\n",
    "lasso_ = Lasso(alpha=1).fit(Xtrain,Ytrain)\n",
    "(lasso_.coef_*100).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:42:18.595757Z",
     "start_time": "2021-01-21T08:42:18.417232Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#将系数进行绘图\n",
    "plt.scatter(range(1,9),(reg.coef_*100).tolist(),color=\"red\",label=\"LR\")\n",
    "plt.scatter(range(1,9),(Ridge_.coef_*100).tolist(),color=\"orange\",label=\"Ridge\")\n",
    "plt.scatter(range(1,9),(lasso_.coef_*100).tolist(),color=\"k\",label=\"Lasso\")\n",
    "plt.plot(range(1,9),[0]*8,color=\"grey\",linestyle=\"--\")\n",
    "plt.xlabel('w') #横坐标是每一个特征所对应的系数\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:42:57.706212Z",
     "start_time": "2021-01-21T08:42:57.688262Z"
    }
   },
   "source": [
    "### 选取最佳的正则化参数取值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:46:35.932903Z",
     "start_time": "2021-01-21T08:46:35.922929Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(200,)"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LassoCV\n",
    "#自己建立Lasso进行alpha选择的范围\n",
    "alpharange = np.logspace(-10, -2, 200,base=10)\n",
    "#其实是形成10为底的指数函数\n",
    "#10**(-10)到10**(-2)次方\n",
    "alpharange.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:46:36.538285Z",
     "start_time": "2021-01-21T08:46:36.514348Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>住户收入中位数</th>\n",
       "      <th>房屋使用年代中位数</th>\n",
       "      <th>平均房间数目</th>\n",
       "      <th>平均卧室数目</th>\n",
       "      <th>街区人口</th>\n",
       "      <th>平均入住率</th>\n",
       "      <th>街区的纬度</th>\n",
       "      <th>街区的经度</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4.1776</td>\n",
       "      <td>35.0</td>\n",
       "      <td>4.425172</td>\n",
       "      <td>1.030683</td>\n",
       "      <td>5380.0</td>\n",
       "      <td>3.368817</td>\n",
       "      <td>37.48</td>\n",
       "      <td>-122.19</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5.3261</td>\n",
       "      <td>38.0</td>\n",
       "      <td>6.267516</td>\n",
       "      <td>1.089172</td>\n",
       "      <td>429.0</td>\n",
       "      <td>2.732484</td>\n",
       "      <td>37.53</td>\n",
       "      <td>-122.30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.9439</td>\n",
       "      <td>26.0</td>\n",
       "      <td>5.768977</td>\n",
       "      <td>1.141914</td>\n",
       "      <td>891.0</td>\n",
       "      <td>2.940594</td>\n",
       "      <td>36.02</td>\n",
       "      <td>-119.08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2.5000</td>\n",
       "      <td>22.0</td>\n",
       "      <td>4.916000</td>\n",
       "      <td>1.012000</td>\n",
       "      <td>733.0</td>\n",
       "      <td>2.932000</td>\n",
       "      <td>38.57</td>\n",
       "      <td>-121.31</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3.8250</td>\n",
       "      <td>34.0</td>\n",
       "      <td>5.036765</td>\n",
       "      <td>1.098039</td>\n",
       "      <td>1134.0</td>\n",
       "      <td>2.779412</td>\n",
       "      <td>33.91</td>\n",
       "      <td>-118.35</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   住户收入中位数  房屋使用年代中位数    平均房间数目    平均卧室数目    街区人口     平均入住率  街区的纬度   街区的经度\n",
       "0   4.1776       35.0  4.425172  1.030683  5380.0  3.368817  37.48 -122.19\n",
       "1   5.3261       38.0  6.267516  1.089172   429.0  2.732484  37.53 -122.30\n",
       "2   1.9439       26.0  5.768977  1.141914   891.0  2.940594  36.02 -119.08\n",
       "3   2.5000       22.0  4.916000  1.012000   733.0  2.932000  38.57 -121.31\n",
       "4   3.8250       34.0  5.036765  1.098039  1134.0  2.779412  33.91 -118.35"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Xtrain.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:46:37.925576Z",
     "start_time": "2021-01-21T08:46:37.333160Z"
    }
   },
   "outputs": [],
   "source": [
    "lasso_ = LassoCV(alphas=alpharange #自行输入的alpha的取值范围\n",
    ",cv=5 #交叉验证的折数\n",
    ").fit(Xtrain, Ytrain)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:46:48.575110Z",
     "start_time": "2021-01-21T08:46:48.557158Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0020729217795953697"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#查看被选择出来的最佳正则化系数\n",
    "lasso_.alpha_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:47:22.322054Z",
     "start_time": "2021-01-21T08:47:22.305099Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.52454913, 0.49856261, 0.55984312, 0.50526576, 0.55262557],\n",
       "       [0.52361933, 0.49748809, 0.55887637, 0.50429373, 0.55283734],\n",
       "       [0.52281927, 0.49655113, 0.55803797, 0.5034594 , 0.55320522],\n",
       "       [0.52213811, 0.49574741, 0.55731858, 0.50274517, 0.55367515],\n",
       "       [0.52155715, 0.49505688, 0.55669995, 0.50213252, 0.55421553],\n",
       "       [0.52106069, 0.49446226, 0.55616707, 0.50160604, 0.55480104],\n",
       "       [0.5206358 , 0.49394903, 0.55570702, 0.50115266, 0.55541214],\n",
       "       [0.52027135, 0.49350539, 0.55530895, 0.50076146, 0.55603333],\n",
       "       [0.51995825, 0.49312085, 0.5549639 , 0.50042318, 0.55665306],\n",
       "       [0.5196886 , 0.49278705, 0.55466406, 0.50013007, 0.55726225],\n",
       "       [0.51945602, 0.49249647, 0.55440306, 0.49987554, 0.55785451],\n",
       "       [0.51925489, 0.49224316, 0.55417527, 0.49965404, 0.55842496],\n",
       "       [0.51908068, 0.49202169, 0.55397615, 0.49946088, 0.55897049],\n",
       "       [0.51892938, 0.49182782, 0.55380162, 0.49929206, 0.55948886],\n",
       "       [0.51879778, 0.49165759, 0.55364841, 0.49914421, 0.55997905],\n",
       "       [0.51868299, 0.49150788, 0.55351357, 0.49901446, 0.5604405 ],\n",
       "       [0.51858268, 0.49137604, 0.55339469, 0.49890035, 0.56087323],\n",
       "       [0.51849488, 0.49125956, 0.55328972, 0.4987998 , 0.56127784],\n",
       "       [0.5184178 , 0.49115652, 0.55319678, 0.49871101, 0.56165507],\n",
       "       [0.51835002, 0.49106526, 0.55311438, 0.49863248, 0.5620059 ],\n",
       "       [0.51829033, 0.49098418, 0.55304118, 0.49856287, 0.56233145],\n",
       "       [0.51823761, 0.49091208, 0.55297609, 0.49850108, 0.56263308],\n",
       "       [0.51819098, 0.49084785, 0.55291806, 0.49844612, 0.56291204],\n",
       "       [0.51814966, 0.49079058, 0.55286626, 0.49839716, 0.56316966],\n",
       "       [0.51811298, 0.49073937, 0.55281996, 0.49835348, 0.56340721],\n",
       "       [0.51808038, 0.49069355, 0.55277854, 0.49831445, 0.5636261 ],\n",
       "       [0.51805132, 0.49065249, 0.5527414 , 0.49827953, 0.56382754],\n",
       "       [0.5180254 , 0.49061566, 0.55270806, 0.49824828, 0.56401276],\n",
       "       [0.51800224, 0.49058258, 0.55267812, 0.49822015, 0.56418292],\n",
       "       [0.51798152, 0.49055285, 0.55265118, 0.49819493, 0.56433912],\n",
       "       [0.51796296, 0.49052608, 0.55262693, 0.49817225, 0.56448243],\n",
       "       [0.5179463 , 0.49050195, 0.55260507, 0.49815185, 0.56461379],\n",
       "       [0.51793135, 0.49048019, 0.55258536, 0.49813345, 0.5647342 ],\n",
       "       [0.51791791, 0.49046055, 0.55256757, 0.49811687, 0.56484448],\n",
       "       [0.5179058 , 0.49044281, 0.55255149, 0.4981019 , 0.56494544],\n",
       "       [0.5178949 , 0.49042677, 0.55253695, 0.49808838, 0.56503784],\n",
       "       [0.51788506, 0.49041226, 0.55252379, 0.49807615, 0.56512236],\n",
       "       [0.51787619, 0.49039913, 0.55251189, 0.4980651 , 0.56519967],\n",
       "       [0.51786817, 0.49038724, 0.5525011 , 0.49805509, 0.56527034],\n",
       "       [0.51786092, 0.49037646, 0.55249132, 0.49804603, 0.56533494],\n",
       "       [0.51785437, 0.49036669, 0.55248246, 0.49803782, 0.56539397],\n",
       "       [0.51784843, 0.49035783, 0.55247442, 0.49803037, 0.5654479 ],\n",
       "       [0.51784306, 0.49034979, 0.55246712, 0.49802362, 0.56549716],\n",
       "       [0.51783819, 0.49034249, 0.5524605 , 0.49801749, 0.56554215],\n",
       "       [0.51783377, 0.49033586, 0.55245448, 0.49801193, 0.56558322],\n",
       "       [0.51782977, 0.49032984, 0.55244901, 0.49800688, 0.56562073],\n",
       "       [0.51782614, 0.49032437, 0.55244405, 0.49800229, 0.56565496],\n",
       "       [0.51782284, 0.49031939, 0.55243953, 0.49799812, 0.56568621],\n",
       "       [0.51781984, 0.49031487, 0.55243543, 0.49799434, 0.56571472],\n",
       "       [0.51781712, 0.49031076, 0.55243169, 0.49799089, 0.56574074],\n",
       "       [0.51781465, 0.49030702, 0.5524283 , 0.49798776, 0.56576449],\n",
       "       [0.5178124 , 0.49030362, 0.55242521, 0.49798491, 0.56578615],\n",
       "       [0.51781036, 0.49030052, 0.5524224 , 0.49798232, 0.56580591],\n",
       "       [0.5178085 , 0.4902977 , 0.55241984, 0.49797996, 0.56582394],\n",
       "       [0.51780681, 0.49029514, 0.55241751, 0.49797781, 0.56584039],\n",
       "       [0.51780528, 0.4902928 , 0.55241539, 0.49797586, 0.56585539],\n",
       "       [0.51780388, 0.49029068, 0.55241346, 0.49797408, 0.56586907],\n",
       "       [0.51780261, 0.49028874, 0.55241171, 0.49797246, 0.56588155],\n",
       "       [0.51780145, 0.49028698, 0.55241011, 0.49797099, 0.56589293],\n",
       "       [0.51780039, 0.49028538, 0.55240865, 0.49796965, 0.56590331],\n",
       "       [0.51779943, 0.49028392, 0.55240732, 0.49796843, 0.56591277],\n",
       "       [0.51779856, 0.49028258, 0.55240611, 0.49796731, 0.5659214 ],\n",
       "       [0.51779777, 0.49028137, 0.55240501, 0.4979663 , 0.56592927],\n",
       "       [0.51779704, 0.49028027, 0.55240401, 0.49796538, 0.56593645],\n",
       "       [0.51779638, 0.49027926, 0.5524031 , 0.49796454, 0.56594299],\n",
       "       [0.51779578, 0.49027834, 0.55240226, 0.49796377, 0.56594896],\n",
       "       [0.51779523, 0.49027751, 0.55240151, 0.49796307, 0.5659544 ],\n",
       "       [0.51779473, 0.49027675, 0.55240081, 0.49796243, 0.56595936],\n",
       "       [0.51779428, 0.49027605, 0.55240018, 0.49796185, 0.56596388],\n",
       "       [0.51779386, 0.49027542, 0.55239961, 0.49796133, 0.565968  ],\n",
       "       [0.51779349, 0.49027485, 0.55239909, 0.49796085, 0.56597176],\n",
       "       [0.51779314, 0.49027432, 0.55239861, 0.49796041, 0.56597519],\n",
       "       [0.51779283, 0.49027384, 0.55239818, 0.49796001, 0.56597831],\n",
       "       [0.51779254, 0.49027341, 0.55239778, 0.49795964, 0.56598116],\n",
       "       [0.51779228, 0.49027301, 0.55239742, 0.49795931, 0.56598376],\n",
       "       [0.51779205, 0.49027265, 0.55239709, 0.49795901, 0.56598613],\n",
       "       [0.51779183, 0.49027232, 0.55239679, 0.49795873, 0.56598828],\n",
       "       [0.51779163, 0.49027202, 0.55239652, 0.49795848, 0.56599025],\n",
       "       [0.51779146, 0.49027174, 0.55239627, 0.49795825, 0.56599205],\n",
       "       [0.51779129, 0.49027149, 0.55239604, 0.49795804, 0.56599368],\n",
       "       [0.51779114, 0.49027127, 0.55239584, 0.49795785, 0.56599517],\n",
       "       [0.51779101, 0.49027106, 0.55239565, 0.49795768, 0.56599653],\n",
       "       [0.51779088, 0.49027087, 0.55239548, 0.49795752, 0.56599777],\n",
       "       [0.51779077, 0.4902707 , 0.55239532, 0.49795738, 0.5659989 ],\n",
       "       [0.51779067, 0.49027054, 0.55239518, 0.49795725, 0.56599993],\n",
       "       [0.51779057, 0.4902704 , 0.55239505, 0.49795713, 0.56600087],\n",
       "       [0.51779049, 0.49027027, 0.55239493, 0.49795702, 0.56600172],\n",
       "       [0.51779041, 0.49027015, 0.55239482, 0.49795692, 0.5660025 ],\n",
       "       [0.51779034, 0.49027004, 0.55239472, 0.49795683, 0.56600322],\n",
       "       [0.51779027, 0.49026994, 0.55239463, 0.49795675, 0.56600386],\n",
       "       [0.51779022, 0.49026985, 0.55239455, 0.49795667, 0.56600446],\n",
       "       [0.51779016, 0.49026977, 0.55239448, 0.4979566 , 0.56600499],\n",
       "       [0.51779011, 0.49026969, 0.55239441, 0.49795654, 0.56600549],\n",
       "       [0.51779007, 0.49026962, 0.55239435, 0.49795648, 0.56600593],\n",
       "       [0.51779003, 0.49026956, 0.55239429, 0.49795643, 0.56600634],\n",
       "       [0.51778999, 0.49026951, 0.55239424, 0.49795638, 0.56600671],\n",
       "       [0.51778996, 0.49026945, 0.55239419, 0.49795634, 0.56600705],\n",
       "       [0.51778993, 0.49026941, 0.55239415, 0.4979563 , 0.56600736],\n",
       "       [0.5177899 , 0.49026936, 0.55239411, 0.49795626, 0.56600764],\n",
       "       [0.51778987, 0.49026932, 0.55239407, 0.49795623, 0.5660079 ],\n",
       "       [0.51778985, 0.49026929, 0.55239404, 0.4979562 , 0.56600813],\n",
       "       [0.51778983, 0.49026926, 0.55239401, 0.49795617, 0.56600835],\n",
       "       [0.51778981, 0.49026923, 0.55239398, 0.49795615, 0.56600854],\n",
       "       [0.51778979, 0.4902692 , 0.55239396, 0.49795613, 0.56600872],\n",
       "       [0.51778977, 0.49026918, 0.55239394, 0.49795611, 0.56600888],\n",
       "       [0.51778976, 0.49026915, 0.55239392, 0.49795609, 0.56600903],\n",
       "       [0.51778975, 0.49026913, 0.5523939 , 0.49795607, 0.56600916],\n",
       "       [0.51778973, 0.49026911, 0.55239388, 0.49795605, 0.56600929],\n",
       "       [0.51778972, 0.4902691 , 0.55239387, 0.49795604, 0.5660094 ],\n",
       "       [0.51778971, 0.49026908, 0.55239385, 0.49795603, 0.5660095 ],\n",
       "       [0.5177897 , 0.49026907, 0.55239384, 0.49795602, 0.56600959],\n",
       "       [0.5177897 , 0.49026905, 0.55239383, 0.49795601, 0.56600968],\n",
       "       [0.51778969, 0.49026904, 0.55239382, 0.497956  , 0.56600975],\n",
       "       [0.51778968, 0.49026903, 0.55239381, 0.49795599, 0.56600983],\n",
       "       [0.51778967, 0.49026902, 0.5523938 , 0.49795598, 0.56600989],\n",
       "       [0.51778967, 0.49026901, 0.55239379, 0.49795597, 0.56600995],\n",
       "       [0.51778966, 0.490269  , 0.55239378, 0.49795596, 0.56601   ],\n",
       "       [0.51778966, 0.490269  , 0.55239378, 0.49795596, 0.56601005],\n",
       "       [0.51778965, 0.49026899, 0.55239377, 0.49795595, 0.56601009],\n",
       "       [0.51778965, 0.49026898, 0.55239376, 0.49795595, 0.56601013],\n",
       "       [0.51778965, 0.49026898, 0.55239376, 0.49795594, 0.56601017],\n",
       "       [0.51778964, 0.49026897, 0.55239375, 0.49795594, 0.5660102 ],\n",
       "       [0.51778964, 0.49026897, 0.55239375, 0.49795593, 0.56601023],\n",
       "       [0.51778964, 0.49026896, 0.55239375, 0.49795593, 0.56601026],\n",
       "       [0.51778963, 0.49026896, 0.55239374, 0.49795593, 0.56601029],\n",
       "       [0.51778963, 0.49026896, 0.55239374, 0.49795592, 0.56601031],\n",
       "       [0.51778963, 0.49026895, 0.55239374, 0.49795592, 0.56601033],\n",
       "       [0.51778963, 0.49026895, 0.55239373, 0.49795592, 0.56601035],\n",
       "       [0.51778963, 0.49026895, 0.55239373, 0.49795592, 0.56601037],\n",
       "       [0.51778962, 0.49026895, 0.55239373, 0.49795591, 0.56601039],\n",
       "       [0.51778962, 0.49026894, 0.55239373, 0.49795591, 0.5660104 ],\n",
       "       [0.51778962, 0.49026894, 0.55239372, 0.49795591, 0.56601041],\n",
       "       [0.51778962, 0.49026894, 0.55239372, 0.49795591, 0.56601043],\n",
       "       [0.51778962, 0.49026894, 0.55239372, 0.49795591, 0.56601044],\n",
       "       [0.51778962, 0.49026894, 0.55239372, 0.49795591, 0.56601045],\n",
       "       [0.51778962, 0.49026894, 0.55239372, 0.49795591, 0.56601046],\n",
       "       [0.51778962, 0.49026893, 0.55239372, 0.4979559 , 0.56601046],\n",
       "       [0.51778962, 0.49026893, 0.55239372, 0.4979559 , 0.56601047],\n",
       "       [0.51778962, 0.49026893, 0.55239372, 0.4979559 , 0.56601048],\n",
       "       [0.51778961, 0.49026893, 0.55239371, 0.4979559 , 0.56601048],\n",
       "       [0.51778961, 0.49026893, 0.55239371, 0.4979559 , 0.56601049],\n",
       "       [0.51778961, 0.49026893, 0.55239371, 0.4979559 , 0.5660105 ],\n",
       "       [0.51778961, 0.49026893, 0.55239371, 0.4979559 , 0.5660105 ],\n",
       "       [0.51778961, 0.49026893, 0.55239371, 0.4979559 , 0.5660105 ],\n",
       "       [0.51778961, 0.49026893, 0.55239371, 0.4979559 , 0.56601051],\n",
       "       [0.51778961, 0.49026893, 0.55239371, 0.4979559 , 0.56601051],\n",
       "       [0.51778961, 0.49026893, 0.55239371, 0.4979559 , 0.56601052],\n",
       "       [0.51778961, 0.49026893, 0.55239371, 0.4979559 , 0.56601052],\n",
       "       [0.51778961, 0.49026893, 0.55239371, 0.4979559 , 0.56601052],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.4979559 , 0.56601052],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.4979559 , 0.56601053],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.4979559 , 0.56601053],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.4979559 , 0.56601053],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.4979559 , 0.56601053],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.4979559 , 0.56601053],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.4979559 , 0.56601054],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.4979559 , 0.56601054],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.4979559 , 0.56601054],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.4979559 , 0.56601054],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.4979559 , 0.56601054],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.4979559 , 0.56601054],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.4979559 , 0.56601054],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601054],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601054],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601054],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601054],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601054],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055],\n",
       "       [0.51778961, 0.49026892, 0.55239371, 0.49795589, 0.56601055]])"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#调用所有交叉验证的结果\n",
    "lasso_.mse_path_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:47:17.577736Z",
     "start_time": "2021-01-21T08:47:17.570754Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(200, 5)"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lasso_.mse_path_.shape #返回每个alpha下的五折交叉验证结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:47:40.588231Z",
     "start_time": "2021-01-21T08:47:40.569282Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.52816924, 0.52742297, 0.5268146 , 0.52632488, 0.52593241,\n",
       "       0.52561942, 0.52537133, 0.5251761 , 0.52502385, 0.52490641,\n",
       "       0.52481712, 0.52475046, 0.52470198, 0.52466795, 0.52464541,\n",
       "       0.52463188, 0.5246254 , 0.52462436, 0.52462744, 0.52463361,\n",
       "       0.52464201, 0.52465199, 0.52466301, 0.52467466, 0.5246866 ,\n",
       "       0.5246986 , 0.52471046, 0.52472203, 0.5247332 , 0.52474392,\n",
       "       0.52475413, 0.52476379, 0.52477291, 0.52478147, 0.52478949,\n",
       "       0.52479697, 0.52480393, 0.52481039, 0.52481639, 0.52482193,\n",
       "       0.52482706, 0.52483179, 0.52483615, 0.52484016, 0.52484385,\n",
       "       0.52484725, 0.52485036, 0.52485322, 0.52485584, 0.52485824,\n",
       "       0.52486044, 0.52486246, 0.5248643 , 0.52486599, 0.52486753,\n",
       "       0.52486895, 0.52487024, 0.52487141, 0.52487249, 0.52487348,\n",
       "       0.52487437, 0.52487519, 0.52487594, 0.52487663, 0.52487725,\n",
       "       0.52487782, 0.52487834, 0.52487882, 0.52487925, 0.52487965,\n",
       "       0.52488001, 0.52488033, 0.52488063, 0.52488091, 0.52488116,\n",
       "       0.52488138, 0.52488159, 0.52488178, 0.52488195, 0.52488211,\n",
       "       0.52488225, 0.52488239, 0.5248825 , 0.52488261, 0.52488271,\n",
       "       0.5248828 , 0.52488289, 0.52488296, 0.52488303, 0.52488309,\n",
       "       0.52488315, 0.5248832 , 0.52488325, 0.52488329, 0.52488333,\n",
       "       0.52488337, 0.5248834 , 0.52488343, 0.52488346, 0.52488348,\n",
       "       0.5248835 , 0.52488352, 0.52488354, 0.52488356, 0.52488357,\n",
       "       0.52488359, 0.5248836 , 0.52488361, 0.52488362, 0.52488363,\n",
       "       0.52488364, 0.52488365, 0.52488366, 0.52488367, 0.52488367,\n",
       "       0.52488368, 0.52488368, 0.52488369, 0.52488369, 0.5248837 ,\n",
       "       0.5248837 , 0.5248837 , 0.52488371, 0.52488371, 0.52488371,\n",
       "       0.52488371, 0.52488371, 0.52488372, 0.52488372, 0.52488372,\n",
       "       0.52488372, 0.52488372, 0.52488372, 0.52488372, 0.52488373,\n",
       "       0.52488373, 0.52488373, 0.52488373, 0.52488373, 0.52488373,\n",
       "       0.52488373, 0.52488373, 0.52488373, 0.52488373, 0.52488373,\n",
       "       0.52488373, 0.52488373, 0.52488373, 0.52488373, 0.52488373,\n",
       "       0.52488373, 0.52488373, 0.52488373, 0.52488373, 0.52488373,\n",
       "       0.52488373, 0.52488373, 0.52488373, 0.52488373, 0.52488373,\n",
       "       0.52488373, 0.52488373, 0.52488374, 0.52488374, 0.52488374,\n",
       "       0.52488374, 0.52488374, 0.52488374, 0.52488374, 0.52488374,\n",
       "       0.52488374, 0.52488374, 0.52488374, 0.52488374, 0.52488374,\n",
       "       0.52488374, 0.52488374, 0.52488374, 0.52488374, 0.52488374,\n",
       "       0.52488374, 0.52488374, 0.52488374, 0.52488374, 0.52488374,\n",
       "       0.52488374, 0.52488374, 0.52488374, 0.52488374, 0.52488374,\n",
       "       0.52488374, 0.52488374, 0.52488374, 0.52488374, 0.52488374,\n",
       "       0.52488374, 0.52488374, 0.52488374, 0.52488374, 0.52488374])"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lasso_.mse_path_.mean(axis=1) #有注意到在岭回归中我们的轴向是axis=0吗？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:49:31.026030Z",
     "start_time": "2021-01-21T08:49:31.018051Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 4.29867301e-01,  1.03623683e-02, -9.32648616e-02,  5.51755252e-01,\n",
       "        1.14732262e-06, -3.31941716e-03, -4.10451223e-01, -4.22410330e-01])"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#最佳正则化系数下获得的模型的系数结果\n",
    "lasso_.coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:49:39.633023Z",
     "start_time": "2021-01-21T08:49:39.626042Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6038982670571436"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lasso_.score(Xtest,Ytest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:49:46.713098Z",
     "start_time": "2021-01-21T08:49:46.701130Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6043668160178817"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#与线性回归相比如何？\n",
    "reg = LinearRegression().fit(Xtrain,Ytrain)\n",
    "reg.score(Xtest,Ytest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:49:59.025322Z",
     "start_time": "2021-01-21T08:49:58.277322Z"
    }
   },
   "outputs": [],
   "source": [
    "#使用lassoCV自带的正则化路径长度和路径中的alpha个数来自动建立alpha选择的范围\n",
    "ls_ = LassoCV(eps=0.00001\n",
    ",n_alphas=300\n",
    ",cv=5\n",
    ").fit(Xtrain, Ytrain)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:50:03.757673Z",
     "start_time": "2021-01-21T08:50:03.746702Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0020954551690628535"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ls_.alpha_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:50:35.051371Z",
     "start_time": "2021-01-21T08:50:35.039403Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2.94059737e+01, 2.82952253e+01, 2.72264331e+01, 2.61980122e+01,\n",
       "       2.52084378e+01, 2.42562424e+01, 2.33400142e+01, 2.24583946e+01,\n",
       "       2.16100763e+01, 2.07938014e+01, 2.00083596e+01, 1.92525862e+01,\n",
       "       1.85253605e+01, 1.78256042e+01, 1.71522798e+01, 1.65043887e+01,\n",
       "       1.58809704e+01, 1.52811004e+01, 1.47038891e+01, 1.41484809e+01,\n",
       "       1.36140520e+01, 1.30998100e+01, 1.26049924e+01, 1.21288655e+01,\n",
       "       1.16707233e+01, 1.12298864e+01, 1.08057012e+01, 1.03975388e+01,\n",
       "       1.00047937e+01, 9.62688384e+00, 9.26324869e+00, 8.91334908e+00,\n",
       "       8.57666619e+00, 8.25270079e+00, 7.94097249e+00, 7.64101907e+00,\n",
       "       7.35239575e+00, 7.07467457e+00, 6.80744372e+00, 6.55030695e+00,\n",
       "       6.30288297e+00, 6.06480491e+00, 5.83571975e+00, 5.61528779e+00,\n",
       "       5.40318218e+00, 5.19908842e+00, 5.00270386e+00, 4.81373731e+00,\n",
       "       4.63190858e+00, 4.45694804e+00, 4.28859627e+00, 4.12660362e+00,\n",
       "       3.97072991e+00, 3.82074399e+00, 3.67642348e+00, 3.53755437e+00,\n",
       "       3.40393074e+00, 3.27535446e+00, 3.15163488e+00, 3.03258855e+00,\n",
       "       2.91803894e+00, 2.80781620e+00, 2.70175688e+00, 2.59970374e+00,\n",
       "       2.50150543e+00, 2.40701636e+00, 2.31609642e+00, 2.22861078e+00,\n",
       "       2.14442973e+00, 2.06342843e+00, 1.98548679e+00, 1.91048923e+00,\n",
       "       1.83832455e+00, 1.76888573e+00, 1.70206982e+00, 1.63777773e+00,\n",
       "       1.57591415e+00, 1.51638733e+00, 1.45910901e+00, 1.40399425e+00,\n",
       "       1.35096134e+00, 1.29993164e+00, 1.25082947e+00, 1.20358204e+00,\n",
       "       1.15811928e+00, 1.11437377e+00, 1.07228066e+00, 1.03177753e+00,\n",
       "       9.92804320e-01, 9.55303239e-01, 9.19218682e-01, 8.84497142e-01,\n",
       "       8.51087135e-01, 8.18939121e-01, 7.88005430e-01, 7.58240193e-01,\n",
       "       7.29599275e-01, 7.02040207e-01, 6.75522125e-01, 6.50005707e-01,\n",
       "       6.25453118e-01, 6.01827951e-01, 5.79095174e-01, 5.57221080e-01,\n",
       "       5.36173234e-01, 5.15920425e-01, 4.96432623e-01, 4.77680932e-01,\n",
       "       4.59637546e-01, 4.42275711e-01, 4.25569683e-01, 4.09494689e-01,\n",
       "       3.94026894e-01, 3.79143363e-01, 3.64822025e-01, 3.51041645e-01,\n",
       "       3.37781790e-01, 3.25022798e-01, 3.12745750e-01, 3.00932442e-01,\n",
       "       2.89565356e-01, 2.78627638e-01, 2.68103069e-01, 2.57976043e-01,\n",
       "       2.48231544e-01, 2.38855123e-01, 2.29832877e-01, 2.21151426e-01,\n",
       "       2.12797900e-01, 2.04759910e-01, 1.97025538e-01, 1.89583315e-01,\n",
       "       1.82422207e-01, 1.75531594e-01, 1.68901260e-01, 1.62521372e-01,\n",
       "       1.56382472e-01, 1.50475455e-01, 1.44791563e-01, 1.39322368e-01,\n",
       "       1.34059761e-01, 1.28995937e-01, 1.24123389e-01, 1.19434891e-01,\n",
       "       1.14923491e-01, 1.10582499e-01, 1.06405479e-01, 1.02386238e-01,\n",
       "       9.85188143e-02, 9.47974747e-02, 9.12167008e-02, 8.77711831e-02,\n",
       "       8.44558125e-02, 8.12656730e-02, 7.81960343e-02, 7.52423447e-02,\n",
       "       7.24002244e-02, 6.96654592e-02, 6.70339940e-02, 6.45019268e-02,\n",
       "       6.20655031e-02, 5.97211101e-02, 5.74652717e-02, 5.52946427e-02,\n",
       "       5.32060046e-02, 5.11962605e-02, 4.92624301e-02, 4.74016461e-02,\n",
       "       4.56111493e-02, 4.38882847e-02, 4.22304977e-02, 4.06353301e-02,\n",
       "       3.91004165e-02, 3.76234811e-02, 3.62023337e-02, 3.48348672e-02,\n",
       "       3.35190539e-02, 3.22529426e-02, 3.10346560e-02, 2.98623876e-02,\n",
       "       2.87343991e-02, 2.76490180e-02, 2.66046349e-02, 2.55997012e-02,\n",
       "       2.46327267e-02, 2.37022776e-02, 2.28069742e-02, 2.19454891e-02,\n",
       "       2.11165447e-02, 2.03189119e-02, 1.95514080e-02, 1.88128950e-02,\n",
       "       1.81022777e-02, 1.74185025e-02, 1.67605555e-02, 1.61274610e-02,\n",
       "       1.55182803e-02, 1.49321101e-02, 1.43680812e-02, 1.38253574e-02,\n",
       "       1.33031338e-02, 1.28006361e-02, 1.23171192e-02, 1.18518661e-02,\n",
       "       1.14041869e-02, 1.09734179e-02, 1.05589203e-02, 1.01600794e-02,\n",
       "       9.77630394e-03, 9.40702475e-03, 9.05169431e-03, 8.70978573e-03,\n",
       "       8.38079201e-03, 8.06422534e-03, 7.75961630e-03, 7.46651323e-03,\n",
       "       7.18448150e-03, 6.91310292e-03, 6.65197510e-03, 6.40071082e-03,\n",
       "       6.15893752e-03, 5.92629670e-03, 5.70244339e-03, 5.48704566e-03,\n",
       "       5.27978413e-03, 5.08035147e-03, 4.88845195e-03, 4.70380102e-03,\n",
       "       4.52612490e-03, 4.35516012e-03, 4.19065316e-03, 4.03236011e-03,\n",
       "       3.88004625e-03, 3.73348572e-03, 3.59246120e-03, 3.45676358e-03,\n",
       "       3.32619166e-03, 3.20055181e-03, 3.07965774e-03, 2.96333019e-03,\n",
       "       2.85139667e-03, 2.74369120e-03, 2.64005407e-03, 2.54033162e-03,\n",
       "       2.44437597e-03, 2.35204484e-03, 2.26320133e-03, 2.17771369e-03,\n",
       "       2.09545517e-03, 2.01630379e-03, 1.94014218e-03, 1.86685742e-03,\n",
       "       1.79634083e-03, 1.72848786e-03, 1.66319789e-03, 1.60037411e-03,\n",
       "       1.53992337e-03, 1.48175602e-03, 1.42578583e-03, 1.37192979e-03,\n",
       "       1.32010804e-03, 1.27024376e-03, 1.22226299e-03, 1.17609459e-03,\n",
       "       1.13167011e-03, 1.08892367e-03, 1.04779188e-03, 1.00821376e-03,\n",
       "       9.70130622e-04, 9.33485992e-04, 8.98225535e-04, 8.64296967e-04,\n",
       "       8.31649980e-04, 8.00236162e-04, 7.70008936e-04, 7.40923479e-04,\n",
       "       7.12936663e-04, 6.86006990e-04, 6.60094529e-04, 6.35160855e-04,\n",
       "       6.11168999e-04, 5.88083384e-04, 5.65869780e-04, 5.44495247e-04,\n",
       "       5.23928092e-04, 5.04137817e-04, 4.85095079e-04, 4.66771639e-04,\n",
       "       4.49140329e-04, 4.32175004e-04, 4.15850508e-04, 4.00142636e-04,\n",
       "       3.85028095e-04, 3.70484474e-04, 3.56490207e-04, 3.43024545e-04,\n",
       "       3.30067519e-04, 3.17599917e-04, 3.05603253e-04, 2.94059737e-04])"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ls_.alphas_ #查看所有自动生成的alpha取值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:50:35.739532Z",
     "start_time": "2021-01-21T08:50:35.726566Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(300,)"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ls_.alphas_.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:50:37.063991Z",
     "start_time": "2021-01-21T08:50:37.049032Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.60389154238192"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ls_.score(Xtest,Ytest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:50:38.131139Z",
     "start_time": "2021-01-21T08:50:38.115182Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 4.29785372e-01,  1.03639989e-02, -9.31060823e-02,  5.50940621e-01,\n",
       "        1.15407943e-06, -3.31909776e-03, -4.10423420e-01, -4.22369926e-01])"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ls_.coef_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 非线性问题：多项式回归"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 使用分箱处理非线性问题"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 导入所需要的库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:58:50.574871Z",
     "start_time": "2021-01-21T08:58:50.563900Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.tree import DecisionTreeRegressor"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 创建需要拟合的数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:59:45.568871Z",
     "start_time": "2021-01-21T08:59:45.454178Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "SEED = np.random.RandomState(42) #设置随机数种子\n",
    "\n",
    "X = SEED.uniform(-3, 3, size=100) #random.uniform，从输入的任意两个整数中取出size个随机数\n",
    "\n",
    "#生成y的思路：先使用NumPy中的函数生成一个sin函数图像，然后再人为添加噪音\n",
    "y = np.sin(X) + SEED.normal(size=len(X)) / 3 #random.normal，生成size个服从正态分布的随机数\n",
    "#使用散点图观察建立的数据集是什么样子\n",
    "plt.scatter(X, y,marker='o',c='k',s=20)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:59:47.722116Z",
     "start_time": "2021-01-21T08:59:47.714137Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100,)"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#为后续建模做准备：sklearn只接受二维以上数组作为特征矩阵的输入\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T08:59:48.467124Z",
     "start_time": "2021-01-21T08:59:48.457151Z"
    }
   },
   "outputs": [],
   "source": [
    "X = X.reshape(-1, 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 使用原始数据进行建模"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:00:50.217155Z",
     "start_time": "2021-01-21T09:00:50.207181Z"
    }
   },
   "outputs": [],
   "source": [
    "#使用原始数据进行建模\n",
    "LinearR = LinearRegression().fit(X, y)\n",
    "TreeR = DecisionTreeRegressor(random_state=0).fit(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:06:48.158301Z",
     "start_time": "2021-01-21T09:06:48.000722Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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Bx54QFVVjznmGF2wYIGqqn7zzTf6l7/8RVVVR4wYoY888oiqqpaXl+v69etVVbVNmzaqqvrggw/q3XffHdy/ceNGVVXNzs7W1atXB6+5efNm3bRpk/bu3Vt//PFHXbx4sbZo0UJ/+uknVVU955xzdMKECdX6PGrUKH3ttdeCr48++mi9/PLLVVV1x44dOnjwYF21apWqqr7yyis6evToqPeTKEwmiWbM4MHW/9706arz5lnP991Xi/r102xQAc3Ozk6trAzffmv18+CDw7cfcoi1/ZtvktOvJEJjzCTRlJg2bRpnnHFGMJx0+PDhgFWm4quvvgorLxHIvffJJ58ES6K3aNEiWJIjwMEHH8zFF1/Mzp07Of3008nNzQ3bP336dM4444xgFvIzzzyTadOmMXz4cHr27Bk8vjZlLALlPObPn8/s2bM5/vjjAaioqKBbt25R78dgiDuh7rKQTBLebt3w/vyz9TrVSrQYCypmmqdApdAkZGVlJR06dAhmE68NRx11FF988QVTpkwhLy+Pa6+9lpEjR8Z0bmSJj0gXnxsBsVNV+vTpw9dffx22f+PGjXW+H4Oh1rhlkkih//FquAlUIEjCCFQQMwfVQBx11FG89dZbbN26lU2bNvG///0PgF122YWePXvy2muvAdbAHyhHceyxx/L0008DloWyYcOGsDZLSkrYfffdGTNmDJdeeik//vhj2P4jjzySt956i7KyMrZs2cKkSZM48sgjY+5zu3bt2LRpk+O+/fbbj9WrVwcFaufOncyZMyfq/RiaBim1CNYtk0QqD/JuUXwBwUplcW1gjEA1EAcddBDnnnsu/fv356STTgork+H3+3n++efp378/ffr0YfLkyQA89thjfPrppxx44IEMHDiwWkTdZ599Rv/+/RkwYAATJ07k6quvrnbNvLw8DjnkEA499FAuvfTSYAXcWDjvvPN44IEHGDBgAL///nvYvszMTF5//XVuuukm+vfvT25ubjCIw+1+DI0fv99Pfn4+JSUlqGpwEWzSRKoxltswUXwxI9oE1XrQoEE6Y8aMsG2//vorBxxwQJJ6ZEgk5rNtOHJycigpKam2PTs7O+Z5zLhy0EHw008wYwZ06wZ77GH97d0bPv7YOibVxrjPP4chQ+Coo6znAY4+2koi+9ln1vNmhIj8oKqDIrcbC8pgMMSM22LXpC2CdQmS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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#放置画布\n",
    "fig, ax1 = plt.subplots(1)\n",
    "#创建测试数据：一系列分布在横坐标上的点\n",
    "line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)\n",
    "#将测试数据带入predict接口，获得模型的拟合效果并进行绘制\n",
    "ax1.plot(line, LinearR.predict(line), linewidth=2, color='green',\n",
    "label=\"linear regression\")\n",
    "ax1.plot(line, TreeR.predict(line), linewidth=2, color='red',\n",
    "label=\"decision tree\")\n",
    "#将原数据上的拟合绘制在图像上\n",
    "ax1.plot(X[:, 0], y, 'o', c='k')\n",
    "#其他图形选项\n",
    "ax1.legend(loc=\"best\")\n",
    "ax1.set_ylabel(\"Regression output\")\n",
    "ax1.set_xlabel(\"Input feature\")\n",
    "ax1.set_title(\"Result before discretization\")\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "#从这个图像来看，可以得出什么结果？"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分箱及分箱的相关问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:01:28.178758Z",
     "start_time": "2021-01-21T09:01:28.169783Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import KBinsDiscretizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:01:28.694381Z",
     "start_time": "2021-01-21T09:01:28.682413Z"
    }
   },
   "outputs": [],
   "source": [
    "#将数据分箱\n",
    "enc = KBinsDiscretizer(n_bins=10 #分几类？\n",
    ",encode=\"onehot\") #ordinal\n",
    "X_binned = enc.fit_transform(X)\n",
    "#encode模式\"onehot\"：使用做哑变量方式做离散化\n",
    "#之后返回一个稀疏矩阵(m,n_bins)，每一列是一个分好的类别\n",
    "#对每一个样本而言，它包含的分类（箱子）中它表示为1，其余分类中它表示为0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:01:29.337660Z",
     "start_time": "2021-01-21T09:01:29.331677Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 10)"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_binned.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:01:35.270802Z",
     "start_time": "2021-01-21T09:01:35.249858Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],\n",
       "       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
       "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],\n",
       "       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],\n",
       "       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],\n",
       "       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],\n",
       "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],\n",
       "       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],\n",
       "       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
       "       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
       "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
       "       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],\n",
       "       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
       "       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
       "       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
       "       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],\n",
       "       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
       "       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],\n",
       "       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
       "       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
       "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
       "       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
       "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],\n",
       "       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
       "       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
       "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.]])"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_binned.toarray()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:01:54.494417Z",
     "start_time": "2021-01-21T09:01:54.490428Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 1)"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:02:10.887598Z",
     "start_time": "2021-01-21T09:02:10.858675Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>96</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>97</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>98</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99</th>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>100 rows × 10 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      0    1    2    3    4    5    6    7    8    9\n",
       "0   0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0\n",
       "1   0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  1.0\n",
       "2   0.0  0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0\n",
       "3   0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0\n",
       "4   0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0\n",
       "..  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...\n",
       "95  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0\n",
       "96  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0\n",
       "97  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0\n",
       "98  1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0\n",
       "99  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0\n",
       "\n",
       "[100 rows x 10 columns]"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#使用pandas打开稀疏矩阵\n",
    "import pandas as pd\n",
    "pd.DataFrame(X_binned.toarray())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:04:58.013894Z",
     "start_time": "2021-01-21T09:04:58.004918Z"
    }
   },
   "outputs": [],
   "source": [
    "#我们将使用分箱后的数据来训练模型，在sklearn中，测试集和训练集的结构必须保持一致，否则报错\n",
    "LinearR_ = LinearRegression().fit(X_binned, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:06:56.233715Z",
     "start_time": "2021-01-21T09:06:56.228729Z"
    }
   },
   "outputs": [],
   "source": [
    "line_binned = enc.transform(line)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:06:56.809177Z",
     "start_time": "2021-01-21T09:06:56.791225Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1000, 10)"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "line_binned.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:07:05.951739Z",
     "start_time": "2021-01-21T09:07:05.946752Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 0., 0., ..., 0., 0., 0.],\n",
       "       [1., 0., 0., ..., 0., 0., 0.],\n",
       "       [1., 0., 0., ..., 0., 0., 0.],\n",
       "       ...,\n",
       "       [0., 0., 0., ..., 0., 0., 1.],\n",
       "       [0., 0., 0., ..., 0., 0., 1.],\n",
       "       [0., 0., 0., ..., 0., 0., 1.]])"
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "line_binned.toarray()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:07:08.745272Z",
     "start_time": "2021-01-21T09:07:08.726322Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1000,)"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "LinearR_.predict(line_binned).shape #line作为测试集"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 使用分箱数据进行建模和绘图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:08:20.015033Z",
     "start_time": "2021-01-21T09:08:19.750740Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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i10YRyzP7U0kZYmX64yFHJE+Z6tJ0osnevbsyauvvhrRc1RXV5OSYv/2+tsXDCKCiJCU1LzfVxdffHGzjlcUJT6oqqklNTl8/hbv9cKtM+3kjbbObMpr5q0zw/26h5t123bRvUNGqzu3N5GUJV6uMxZyRPqc8fvJasEUFxczZMgQAGbOnMnJJ5/MscceS//+/bnuuuvq5r333nsceOCBjBw5ktNOO40dO3YAcNttt7HvvvsyZMgQcnNzEREADjvsMP7+978zevRopk+f3uCc06ZN45xzzuHggw/mnHPOYf369Zxyyinsu+++7Lvvvnz55ZcArF+/nqOPPprBgwczefJkHA4HGzZsoLi4mIEDB3LuuecyZMgQli9fzj333MO+++7L0KFDueWWWwDYuXMnf/nLXxg2bBhDhgzh5ZdfBuCGG25g0KBBDB06lGuuuaZOpnvvvReABQsWcMABBzB06FBOOukkNm/eXHdN119/Pfvttx8DBgzg888/j8h7oihK/NISdebtt90KNE9nHjbmYNWZihIhWqUH2dwamQQFuUWadNyCBQuYP38+6enpDBw4kL/97W+0adOG22+/nQ8++IC2bdty1113cf/993PzzTdz2WWXcfPNNwNwzjnn8N///pfjjz8egMrKSubOnWt7noULF/LFF1/Qpk0bzjrrLK688koOOeQQSktLGTduHL/99hu33norRxxxBDfeeCP/+9//ePrpp+uOX7JkCc899xwHHHAA7733HkuWLOG7775DRJg4cSKfffYZ69evp2fPnrz99tsAbN26lY0bN/L666+zaNEijDFs2bKlkWznnnsuDz/8MGPHjuXmm2/m1ltv5cEHHwQs7813333HnDlzuPXWW/nggw+a9DoritI0WprOfOfttzn15BOB2OnMv0w4vtk68577H2TcUUeozlSUCNAqDeR448gjj6Rjx44ADBo0iJKSErZs2cLChQs5+OCDAUuJH3jggQB8/PHH3H333ZSVlbFp0yYGDx5cZyCffvrpPs8zceJE2rRpA8AHH3zAwoUL6/Zt27aNHTt28MUXX/D6668DcOyxx9K5c+e6OQ6HgwMOOACwPDXvvfceI0aMAGDHjh0sWbKEMWPGcPXVV3P99dczYcIExowZQ3V1NRkZGVx44YVMmDCBCRMmNJBr69atbNmyhbFjxwJw3nnncdppp9XtP/nkkwEYNWoUxcXFoby0iqK0QJqrM/vvtTdwIhA7nbl9e/N15phDDwVUZypKJGiVBnJTvRaRIj09ve5xcnIy1dXViAhHH300L730UoO5FRUVXHLJJcydO5c+ffowbdq0BvUs27Zt6/M8nvtqa2v55ptvyMgIPn7H83gR4cYbb+Siiy5qNG/evHnMmTOHm266iSOPPJKbb76Z7777jg8//JBXX32VRx55hI8++ijo87pfH/droyhKdAmkM8sqq8lMi97XSXN15q440Jmer5nqTEWJPzQGOU454IAD+PLLL1m6dClgxan9/vvvdcZw165d2bFjR5MTV4455hgefvjhuucLFiwA4OCDD+bf//43YHk83HFt3owbN45nnnmmLsZv5cqVrFu3jlWrVpGZmcnZZ5/Ntddey7x589ixYwdbt25l/PjxPPDAA/z4448N1urYsSOdO3eui5V74YUX6rzJSnxTVFRETk4OSUlJ5OTkUFRUFGuRlFZKounMVWHQmV9+8QWgOjPRUL2ZGLRKD3Ii0K1bN2bOnMmZZ57Jrl27ALj99tsZMGAAU6ZMYciQIey+++7su+++TVr/oYce4tJLL2Xo0KFUV1dz6KGH8sQTT3DLLbdw5pln8sILL3DggQey++670759+zql7uaYY47ht99+q7uF2a5dOwoLC1m6dCnXXnstSUlJpKam8vjjj7N9+3ZOOOEEKioqEBHuv//+RvI899xzXHzxxZSVldGvXz+effbZJl2XEj2KiorIzc2lrKwMgJKSEnJzcwFwOp2xFE1phSSazsxs25YXi4qapTNzL7qIq8vLVWcmEKo3EwfjzuZtSYwePVq8ky5+++039t577xhJlDjs2rWL5ORkUlJS+Prrr5k6dWqdpyRe0fc2NuTk5FBSUtJo3NGzJ8UrV8ZAIsUY84OIjA71uObqzHCHWEQ6ZCOc6zdVZ4ZDhuasEQ29+fOKrezTu2NEzxGP5/bGUxafetPhaFK8eLxcZyzkCNc5felN9SArDSgtLeWvf/0rtbW1pKWl8dRTT8VaJCVOKS0ttR9ftSrKkihK7FCdqYSCT73pY1yJHWogKw3o378/8+fPj7UYSgKQnZ1t6wnJ9pP0pCgtDdWZSij41JvZ2TGQRvGHJukpitIk8vPzyfSoJgCQCeQPHRobgRRFUeKc/Px8MjMzG4xlZmaSn58fI4kUX8TUQDbGPGOMWWeM+cXH/sOMMVuNMQtc283RllFRFHucTicFl12GAzCAo2tXCgCnekIURVFscTqdFBQU4HA4MMbgcDgoKCjQBL04JNYe5JnAsQHmfC4iw13bbVGQSVGUIHEeeijFQO3xx1P86KM4AWpqYiuUoihKHON0OikuLqa2tpbi4mI1juOUmBrIIvIZsCmWMiiK0gzcVXCMgSSXOlEDWVEURUlwYu1BDoYDjTE/GmPeMcYM9jXJGJNrjJlrjJm7fv36aMrXJKZNm8a9997bpGMPOuggv/vHjx/Pli1bmrS2J7Nnz27QWlVRGlFba/1NSoLk5IZjcYgW6K9HdWY9qjMVxTetVW/Gu4E8D3CIyDDgYWC2r4kiUiAio0VkdLdu3aIlX0z46quv/O6fM2cOnTp1avZ5/Cl7bV+qAPXGsDH1BnKcepDdBfpLSkoQkboC/a1F2XujOrMe1ZmKYk9r1ptxbSCLyDYR2eF6PAdINcZ0jbFYTSY/P58BAwZwyCGHsHjx4rrxP/74g2OPPZZRo0YxZswYFi1aBMDatWs56aSTGDZsGMOGDatT8u3atQNg9erVHHrooQwfPpwhQ4bUtWrOyclhw4YNANx///0MGTKEIUOG8OCDDwJQXFzM3nvvzZQpUxg8eDDHHHMM5eXlDWT96quvePPNN7n22msZPnw4f/zxB4cddhh///vfGT16NNOnT+eHH35g7NixjBo1inHjxrF69Wq/16O0QNwhFklJ9SEW8eRBLi6Gk0+GI48k78IL67pXuSkrKyMvLy82sikBiZTOPGDfUTHXmRP/Ml51phL35OXltV69KSIx3YAc4Bcf+3anvtvffkCp+7m/bdSoUeLNwoUL659YX+vh3/wwd+5cGTJkiOzcuVO2bt0qe+yxh9xzzz0iInLEEUfI77//LiIi33zzjRx++OEiIvLXv/5VHnjgARERqa6uli1btoiISNu2bUVE5N5775Xbb7+9bv+2bdtERMThcMj69evrzrljxw7Zvn27DBo0SObNmyd//vmnJCcny/z580VE5LTTTpMXXnihkcznnXeevPLKK3XPx44dK1OnThURkcrKSjnwwANl3bp1IiIya9YsueCCC/xeT6Ro8N4q0eXll63//VNPFZkzx3o8blysparnnnvqPp8GBJvNGBNrKcMGMFeaoIcD6kxr8cZ6bsIEEZCK116vH3vySWvelCn1YytXWmM9egR1HTt3VUVUZ+7cVRVznflcYVGzdebOXVVBzbMjGnrzp+VbIn6OeDy3N5GUJdLXaYwJSm/G4vUO1zl96c2YNgoxxrwEHAZ0NcasAG4BUgFE5AngVGCqMaYaKAfOcF1MwvH5559z0kkn1dU/nDhxIgA7duzgq6++4rTTTqubu2vXLgA++ugjnn/+eQCSk5Pp2LFhS8V9992XSZMmUVVVxYknnsjw4cMb7P/iiy846aSTaOtq3HDyySfz+eefM3HiRPr27Vs3f9SoUUG3uDz99NMBWLx4Mb/88gtHH300ADU1NfTo0cPv9SgtkHj3IFdVWX/POIPsjz6iZN26RlO0QH98EkmdWVaxi9NOOTmmOrOquppePXuqzlTimtbc2CSmBrKInBlg/yPAIxE4cdiXbCq1tbV06tSJBQsWhHzsoYceymeffcbbb7/N+eefz1VXXcW5554b1LHpHg0ekpOTG90u9IX7i0NEGDx4MF9//XWD/du2bWvy9SgJiE2SXtHKleTl5FBaWkp2djb5+fmxK2Pklq9fP/InTCA3N7fB7UIt0B8CdnrzrbcAqKn0iK/NzbU2T3r2DJveDYfOfP2NN2OuM8sqq8lMS1GdqQBWrG9eXl586E0P8vPzW63ejOsY5JbEoYceyuzZsykvL2f79u285fpi6dChA3379uWVV14BLCX6448/AnDkkUfy+OOPA5aHduvWrQ3WLCkpoXv37kyZMoXJkyczb968BvvHjBnD7NmzKSsrY+fOnbz++uuMGTMmaJnbt2/P9u3bbfcNHDiQ9evX1yn7qqoqfv31V7/Xo7RAvMq8FQG5ixbFT0KHh3x1BfrT0qzGJrvvrgX645hI6swLLpysOlOJG+I5Ea41NzZRAzlKjBw5ktNPP51hw4Zx3HHHse+++9btKyoq4umnn2bYsGEMHjyYN954A4Dp06fz8ccfs88++zBq1KhG2dGffPIJw4YNY8SIEbz88stcccUVjc55/vnns99++7H//vszefJkRowYEbTMZ5xxBvfccw8jRozgjz/+aLAvLS2NV199leuvv55hw4YxfPjwuoQYX9ejtEC8PMh5QJlXiEVMEzo85cNVoH/oUGqB4jfeaBVKPlGJpM48cL/RMdeZB+47WnWmAsR/IlyrbWxiF5ic6FtQCSdKi0Hf2xjy/PNW8tXZZ4t89ln8JcLdcosl3y231I/tt5819vXXsZEpghDJJD0/NCdZLBrrRXv9aMmgSXrxeW5vAskSbCJcU9aOFi0xSU89yIqiNB0vD7KvtI2YJXR4eZABKxwE4ioXQVGU1osv/dgaEuHiGTWQFUVpOl4xyPlAZlJDtRLThA5P+dzEY7UNRVFaLfn5+XXVWty0lkS4eKZVGciiHqMWh76nMcbLg+wECrKzcYCVCNepU2wTOtSD3Cz089Uy0fc1vmjNiXDxTEzLvEWTjIwMNm7cSFZWFsbTm6QkLCLCxo0bycjIiLUorRcvDzKAs3NnnO4asTfeCLFU8nYGsnqQg0J1ZstE9WZ84nQ61SCOM1qNgdy7d29WrFjB+vXrYy2KEkYyMjLo3bt3rMWIOTGroWlTB5mamsifN1jUQG4yoejMyupa0lLCd0My3OtFe/1oydDUNVRvxm/dYSV+aDUGcmpqKn379o21GIoSdtw1NN1lgtw1NIHIK3wbD3IDwzPWnke7GGQNsQiKUHTmzyu2snfvjoEnBkm414v2+tGSIR6uIxGJqc5UEoZWFYOsKC2RvH/8I3Y1NAN5kKNkIBcVFZGTk0NSUhI5OTn1BfbVg6woihfxXnc4WvjUmwrQijzIitJSKV2+3H68tDTyJ48DD7Jfb5Am6SmK4oUv3RgVnRknqBc9MOpBVpQEJ7tXL/vxaNTQjAMPct7VV/v2BqkHWVEUL7TusHrRg0ENZEVJcPJvuIFMr7Go1dB0G5m+PMhJkVcxpWvX2o+XljaUz416kBWlVaN1h9WLHgxqICtKguM88UQKoL72cK9e0auh6TYyY+hBzk5Ptx/Pzm4onxv1ICtKq0brDqsXPRjUQFaUREcEJ1AM1ALFX34ZPUUfyIMcBQM5f/fdfXvQNQZZURQbnE4nxcXF1NbWUlxc3KqMY1AvejCogawoiY63oRdNz6iNB7lo2zZysJRLzrRpEc+MdrZpY3nQU1MtD3rXrvXeII1BVhQlAYh2RQn1ogdGq1goSqLjbehFs1GHlwe5CMjduhV36kfJ5s2Rz4yuqMAJOEeOhG+/hYcegjPPbCifepAVRYlTYlVRQrv3+Uc9yIqS6MSRBzkPKPOaEvHM6PJy62/bttZfzx8Ido1C1IOsKEocoRUl4hM1kBUl0YmlgezpQe7aFV/5z+HOjG5wO3LdOooA2rWzdnoayCGEWGjRfEVRYkG0KkpEQse51xyW3bnF6U01kBUl0YlRiEVRURE5d9xhxRoXFFA0a1bEMqM9FXvXrl2ZNGkSJSUliAglIuQCRevXW5MDGcjeIRYrVlB03XXkXnhh/ZquW5wtSdkrihJbfBmoMdGbYdBx7tCQlqo31UBWlEQnBh7kOsW4ZQsClGzbRm5uLuP/8pdGmdHGGMaPH9/0c82YQe7kyXVKeOPGjVRWVjaYUwbk/fST9cTz+gN5kKurYcQI8u65h7Jduxquqbc4FUUJE/6Myfz8fNLS0hrMT0tLa1ZFCe/z2erNZuq4lh4aElMD2RjzjDFmnTHmFx/7jTHmIWPMUmPMT8aYkdGWUVHiHm8DOZIe5JkzIT2dvLPPtlWMc+bM4bzzzsOzuJuI8NzMmRQ9+mjoiXFbt5KXm0tZRUXAqaU7d1oPAsUge3qQKypgw4aohYYoitI6CWRMipdu9H4ejvPZ0Rwd19KbjcTagzwTONbP/uOA/q4tF3g8CjIpSmLh7TGOpAf53XehstKvQTlnzhy8VXtZeTl5l10GJ5wQ2vlKSigN8osiuykxyK652T7qNWvRfEVRwoE/YzIvL4+qqqoG41VVVc3yxAZrpDZHx7X0ZiMxLfMmIp8ZY3L8TDkBeF6sn1LfGGM6GWN6iMjq6EioKAlAND3Irlt02V27UrJhQ6Pd2dnZvr8IAL78MuTzZQMlAaZlZmaSf+CB8P77gUMsPD3IrtcqPyODXGMaeFwy27TRovmKojSL71d+z/tL5tFl9y5sXL2x0f5undtTWmKv4UpLSnjhxxcASC7fRfaHc6lJT6X06P3q5iTV9GSf3kc2OjY7O5sSH+u6aW5jkPz8/Abl6cKxZjwR73WQewHLPZ6vcI01MpCNMblYXuYW8+tFUYIimjHILgM5/9xzyX3kEco8YtrcijEvL89WMWcDbN8e2vl27SIfyE1KoszrupKwOgc6HA7y8/NxfvedZSA3wYPszMyE6dPJy8ujtKSEbCD/wQdbdI1Q1ZmKElk2lG3gwKcPpEZq4EDI/I9XGcxUODttG69h7wTonAbnzj4XgB7bYNX9sKodHOaKJutQAdM+gf+aLB67tN5ovuHh+VxYu5Nb05KoqbT/PsjIyuCwMT0YcM+VPPfGrbx8wp4AJFfXcvMD86hJMtx29ai6+ee+8jt7FG/jhVP7s7RvRwD2/2EtN2Ql82h1MuuqasnOzrZ0cQvRm/FuIAeNiBQABQCjR4/WDgBK6yGaVSxcBrHzmGNgxw7yCgooBbI7diT/0UfrFKOtV6G8HKqqYNcuSE8P7ny7duEEGDiQK9atY+PGeg9MLfVGudPphLlzrR2hxCC75yYn1xfNz8qCTZvg5JODkzFMiAhfLf+KGfNnMG3sNBydHJE+n+pMRYkgmzetYsSKGqRNG/Y++xT6LvwfBX9uZm1lDW27tmW4czgjt5TT9ptS7vhjE9VV9bo8Pclw0th+7Bp6IACZO3bxxdi5lGWmcfbQfQHY9+4XufybWr7uvZF3lr5Td+wLP8Gh5XDXBNj5IVDuJVgqVIytICPlD/b9EUor1/PO4CXWrmp460eoTKLBmlf8Avv+ATfts573XGpzj0Vw0yZY/BfIOeJ8br/s2fC/iDEk3g3klUAfj+e9XWOKoriJpgfZXekhLQ3noYfiLCiwnl95JbiMY7eRnJeXR2lpab1X4W9/g82bYft2il59tfF+O6+D63zO7GzyysoaGMhQn+TidDrrWl03xYNcd6zn4yjVk16/cz3P//g8M+bPYNGGRQDkdMzhlsNuicr5FUWJDEklpXz/FPyxWzV7TH8BToLbfMwdWFQUUCcWJbnmnFJEdnY2R938JG+ftYrOu2Xy9shBdfP+cMxnWVU1rxw0nPOOmcL68vUNT1YF3b7pxtRX7uf7o/6ge9dOvD2kv7Wvtpbvs38AY3h77Oi6Q9oNXsz3m7dx7dABXNHF8iC3OXQtL416iU93vk9Kz/bNfr3ijXg3kN8ELjPGzAL2B7Zq/LGieBGDEAvS0yE1tX48qWG+r20L03/8AzZvtmoOv/hiXVk1v21VPQzygBnTdoZtkDHIDQxk99wIeuJrpZYPln3AjHkzmL1oNlW1VoJO97bduWD4BTiHtoxblIrSmqlOTeb7nrChWwZ7BJgbqO2zXTvqS/52Bf+8czo3nD654eT+9WU1N6w+yXa9Das3cNRBZ8NBNjsHTmg81t+mVGd/mJe+iRXvv49Iy+tMGusyby8BXwMDjTErjDEXGmMuNsZc7JoyB1gGLAWeAi6JkaiKEr/EIMSCtDS/BrItnTsDkPfss8HXHHbPS08PnDEdLg+yV6e9cHafWr51Obd9ehv9pvdjXOE4Xln4CjVSw4QBE5h9+myWX7mcO466gz277NnkcyiKEh/scvRiv1y4YlKfwJMD4KtM3EN3+fJJW0S60kTXkvWcuwD6/t7Qd9kSOpPGuorFmQH2C3BplMRRlMQkFh5kbwPZR5m0BuTnwzPPUPqf/9jutvUQe3isA2ZM23l+7WKQgw2xqKmxvDaTJ9fVYS4pKSF3yhTAxtvtg6qaKt76/S1mzJvB/5b+D3EVwevbqS8XjriQ84efT68OvYJaS1GUxKGm1tIvySY5wMzA+LqDtmbVCr/HRbrSRM53v/PcbPjfrt/hRmvMztvt8y5hHBPrOsiKojSXGJR5a5IH+S9/gddeI9thn3zm9mg08Dz8/e8UAaSn43Q6KSgowOFwYIzB4XBQUFBQr3CD9SAHG2JRW0veFVc0alJSVl5O3j/+EfByf9/4O9e/fz29H+jNKf8+hXeWvkNqciqnDz6d9895n6WXLyXv0Dw1jhWlhVIjln4xpvmmli+P7+49ewO+PbYB9WYz2dx3d54bBn/s0bVurKV02FMDWVESHZtGIeG6vdVoHXeSnHcMcjAeZBf5+fmN2lFnpqaSn59veR6mTKlvx7ppE7lAkatsnNPppLi4mNraWoqLixsq+WBjkENI0iv1Sgp0U7p8ue14WVUZL/z4AmNnjmXgIwO5+6u7WbdzHYO6DeKBcQ+w8qqVzDp1Fkf1O4qkMHxpKooSPsKtN/frvS+9b4VT7lzcbNls9WZmJpdff7PfNtYQQG82k5UHDOb8k+CzQ+qjrFtKh714T9JTFCUQXh7kog8+IPexxygrt2r7NCUsABGKCgvJvfjihrfJXIawsykeZBcNqly4ag6PHzbMZ/3kMiDvu+8IKHm4Pcg1NWR37EjJ1q2NTpXdu3eD5/NXz2fGvBkU/VzE1l3W/MzUTM4YfAZTRk1h/177Y0L4EaEoSnQJV1iA9zorgHtXVbBXUVGzDFO76kDjx4/nobtuY/XKxj/YG1T4iSDuH/pCvWPCV5OSRKu3ri4MRUl0vAzkvKefrjOO3ZSVl5N3ww3Br3f44eSde27j22Qi5EHTYpA9qPNo3H47+cBzCxb47fpUumNH4EXtYpCbmaSXP3YsDX02kAnk33wzWyu28sTcJxhVMIqRBSN5bO5jbN21lf167UfBhAJWX72ap094mgN6H6DGsaLEOeEKC7Bbp0IIS3iBpyc4Pz+f5557ztY4dhMNj21qdS2dyyCtvD7x2pe3O9E67KmBrCiJjleIRemWLbbTSlcGWUK8rAw+/RRfqrUUICuLog8+IAdLieT8619Nux2ZlsYVQFl1td9pQXke7DzIITQKsVvHuffeFACOTp0wxpCdlEQB8FX6h/S4rwdT357KvNXz6JzRmcv3u5wfL/6Rbyd/y5RRU+iQ3iGwzIqixAXhCgsItE64wjiuuOKKRoa4N9Hw2A6c8x2b7obzn/uubizScc/RImCIhTHmYBH5MtCYoigxwsuDnN2mDSXl3q2TILt79+DWcxmr2cZQ4p0ACGQ7HBS99BK5+fl1bVNLNm9u2u3In37CPsq3nqA9D+GKQfbcX12NEzjhmst54vD2nH/sDXTdDlf+NIvydnBE3yOYPGIyJ+19EhkpGYFlVBQlLglXWIC/dcIZxuHdNMmbaHlsa9PT2JQBFWkNK3UEquucCATjQX44yDFFUWKBlwc5PzvbPizg4osJCpeBnJ+Z6fM2WV5eXuPqDk25HTlnjt/9IXkegg2xCNKDXFNdRfHGPwCY9sXtXPv+tezCmn/V6MtY8rclfHjuh5y5z5lqHCtKghOusAC7dVKTTb3eDFMYhz+i6bH9c8LBZN0AT503MuLnijY+DWRjzIHGmKuBbsaYqzy2aUDzi/opihIevLy8zjZtrLCADh2s21tpaRQAzqOOCm49l4HsbNvW522ysN2O3LTJ577CwsKQMq6L5s+3Qj6mT6+/ddkED3KlqzTT8YXjeWvhbGvMCMcPOJ7O7bsBcMMB12gzD0VpQYQrLKDBOoADuKl7m/DqTT/zQ9abzQz5cCfp1bayTnppQDusMIz2Hts24NTIi6YoSlC4DOQisAzEBQvIA/KPOsoq67PfflYFiGDrI7vjgVNSfJYHCld3puysLNvxrKys0DPHZ82iBBBcty4nTaJosau8UoAY5NqkJF5b+BrHFR3HLxsWArB2+xo6p7YH4LYjb+fNM98kM8N6ToCYaUVREgNPAzEvL4/8/Pxml0Nz680PPp3J0cfD9lMHAGHUmz7mN0lv+ikPFwx1VSxswvESHZ8Gsoh8KiK3AgeIyK0e2/0isiSKMipKiyRsrThraykCcqHeQARy33rLWjPFlWoQrFHnYSD7Imy3I884g1SvsdTUVKZPnx7SOnl5eZRVVTUYK6usJG/VKutJenr9Dg8PcummPwH4atW3nPrKqfxv6f+oTbYM6CeOexTn3qcD0Kl9V7dw1l81kBUl6oS7fXE4DER/7OzehRmj4LthVv5HOMM4UlMbas4m681mhnz0/OZXvngaznr155DOnQgEE4M80xjzkfcWcckUpQUTVsXsKr3mnc9cVlVlKTq76g7+CMJADluWckoK3gXQmlISzeetS4DrroP99qsbq3LFET/yzUNc+PoFAFRIFYO7DebBcQ8yrMcIAPbdfSTGHaLhfg3dr4mXMa4oSmSJhDEb6Y5v7rADt04LZ3UHbz0ZVr0ZQshHxtadHLwceq3ZHvL5451gDORrgGtd2z+BBcDcCMqkKC2b+fPJ82jA4abJilnEd0m20tJ64y6MHmQIT3emvJdeotJrrLKyMuTXweetS4cD7roLUlKYt3oel7x9CU/8UABA8eZi2iZZnuXRffbn56k/c8UBV5CakmYd7KpiAdS/FqF64xVFCQuRMGYj3fEtde16Ji6CvYvrjcew6M28PCorG2rOsOrNEEI+1h8wlIMnwXMnDgjp3IlAQANZRH7w2L4UkauAwyIvmqK0UKZN89n4okmKubYWX+osOzu73qgLowc5XJSuX28/HuLr4OvWZd60PB77/jFGPjmSUQWjeHzu43y1tpIc4P73Yd6c9hQBndp2qffAeHrcvZP4NMRCUWJCJIzZcMUE+6LzDwt5YxacOWdZWNZzE67XItiQD3+hLVVZnfgqG0p7tA3p3IlAQAPZGNPFY+tqjBkHdIyCbIrSMikr82/QhooI+UCmV7vnOkUXgRCLcBGuLyjvW5fde3VnRO4ILl95OZfOuZT5a+bTpU0Xxu0cxxt/JtfFai9fv4FcoGj16vrFvOogA409yBpioShRJRLGbKQ7vu3s2oE3B8CSvp3Dsp6bSOlNu5CPQKEtycb6fpFWVsXCzQ9YIRU/AF8DVwMXRlIoRWnR1NZaBq1n4hjNUMwiOIGCvfayV3QRSNILF+H8gjrqhKO4tOhS+j/Un7VT1vJlpy+pqK7gyL5H8tIpL7HyqpUs+vciyqsb/lAoA/Lc1S6gYcMRbw+yhlgoSkyIhDEb6Y5v60YM4ISz4NXj9w7Lem7C+VoECvkIFNrSvmQNN3wOY74LslNrAhFMiEVfEenn+ttfRI4RkS+iIZyitEjcBu1VV+FIT7dqZe62W9MVsyuRzNmzp72ii2MPct0XVHJyXc3QUF6Hmtoa3lnyDqf8+xR6P9Cb6z64jt83/k7P9j3JG5PHH5f/wQfnfsAZQ84gIyXD961Jz86Dng1HvF+L1FSrnN6pp4Ytk15RlMBEypgNR0ywL2pqLZ3r9rKGi2i2cg4UztHhz5Xc8SEc/ZV/AzncFUiiQTCtpjOAS4BDsO5Kfg48ISIVfg9UFMUet0F7zDE4f/gB3nsPnn8exo1r2nru+pO+spjj2EAGV4vVq64ib906SqnvEuVP2ZdsKeGZ+c/wzIJnWLFtBWB9CU0cOJEpI6dw7J7HkpLUWH6fbWB79ap/4qeRSNH69eQCZevWWXI0sVWsoiihk2jti2tqqjC19bWCE5FALbjLc3pzxyFQO6A7B/tYI1wttqNNMO/a88BgrPbSj7gevxBJoRSlRePZ3S3NVTGh0ruWQwi4DeQkHx/nOA6xAJfyXL++YZMPm/JNlTWVvPLrK4wrHEff6X257bPbWLFtBXt03oN/HfEvSq8s5Y0z3mDCgAm2xjH4uTV51131A54/KLxei7ylSxuX0ysrI+/aa5t49YqitFT2mP0ZtbfB5U99F9Z1I12/2ZNA4Rxlezr4x1HwzkG7+1wj0uX0IkUw34BDRGSQx/OPjTELIyWQorR4wm0gu9dLUA9yXl4eZV5dmNzK0+l08tv633h6/tM89+NzbCjbAEB6cjqnDDqFySMmMzZnbNAeGre3Ii8vj9LSUrKzs8nPz2/oxfDjQS6tsL9xVuqZ5KcoioJH4lqYPcj+DM5we2QD6cz6Tnq+k/QiXU4vUgTzrs0zxhzgfmKM2R+tg6woTcfTQHaXDQuHB7kZBnKD+LCzzqIIomYg+1KSJaUlHPLMIQx6bBD3fX0fG8o2sM9u+/DQsQ+x6upVFJ1cxOF9Dw/59mWgmMOi1autlt3HH0/Op582eC2yHQ7bNbM7dQpJBkVREptgYmoXnnAQZho8mesr+KBpRNvg9KczU8t2MXgtVL5X4vP1iHQ5vUgRzDfgKOArY4z7lc8GFhtjfgZERIZGTDpFaYnYeZCbUzasmSEWjeLD1q0jF2DtWqIRHeYrxo0O8OXyL2mX1o4zh5zJlJFTGN1zdJM6RgVLUVERuT//bIVRiFCya5f1Wnz8Mc4jjyQ/P7/BawWQCYzv14+cnBzfXmlFUaJK2cblrCn7A+nYEclsYw2Wl5O0ZSuSno50cZVeEyFpzVoAanvUhwmYjZswlZXUdu4EGRnW2I6dmO3bee3dD7n2+lsodyX3lpSUMGXyZDZXbObkv54MQNL6DVQuLyalBkxSeJP0AsUFR5NOPy7mxsdhsvmDCtdXkXeMsa3ezMxk/Pjx8a03RcTvhpVY7nMLdHyAtY8FFgNLgRts9p8PrMfq3rcAmBzMuqNGjRJFiVv23VcERL79VuTCC63HTz3V9PXeeMNaY8IE+/0XX2ztf/TRhuPvvCNy+OHiSE8XrPDfBpujTZumyxQCTz7zpKRmpDY8fyqy5+Q95el5T8v2XdujIoeIiMPhsH8tunevm1NYWCgOh0OMMeLo3FmmgmQmJzeYn5mZKYWFhVGT2w0wV5qgi5urM39avqVZx0d6vWivHy0Z4uE6/BEr+ea/9IBUJiECct4JCNOs7eS/WmOv7l0/lnqTNbYrqX6Maci7/azxo8+uH7vsOGusc1pjHQEIHevn/rSbNXfIVOSMl6eE9foKCwslMzMzLnTO968/Kj2S7F8Ph8PRQOY6velwyNSpU5t9DeH6//KlN4O5N3m7iJR4bp5jQdrhjTDGJAOPAscBg4AzjTGDbKa+LCLDXduMpp5PUeIGDw9yUXGxdTt/ypSgS980urX3ySfWjlBDLO69Fz7+mNJdu2wPa1D6LMyICJ8Wf8o5r5/DFauuoGp8VV37ofa7tefO6Xey5KklTBoxiXZp7SImhzc+b126qlaA1+3GRx5hDlDm9doGm4CSiKWPFCXWBPrcfLF7JftOgd+7GjLad6JHux50XNyRd99OIgm4+A9Dx8Ud6dGuBz3a7c6aDkms65Dsem5t5R0yWNMhiXbtu9SNpbbvyJoOSWz2FRG3lbq5W9unsaZDEj069eYIx1/Cev3RLPMWiJ3DB7PaR/ixpz71DtOYM2dOkxP33O//sOzOkdWbdlaz5wbM83qeAiwMdFwQ6x4IvOvx/EbgRq855wOPhLq2epCVuGbECBGQwttvl8yUlJB+Qdt6DtLTpRBETjjB/qArrpBCEEfnznW/3gsLC0WGDhUBcXTpYv/rPzs77Je+evtqufPzO6X/Q/0beGuOfv5oefmXl6WiqiLs5wwFnx5kD09IAzZvFmPnSQIxxvg9V+Hzz9t7UGbOFKmubpL8qAc5LtaPlgzxcB3+iIR8wXhP7/3yXmEacuX/rgz6GF/n8vR6uueHqici+T7F+n/g85LPLc95KHpTRIwxTdObEfCe+9Kb/gzYG4HtQDWwzfV4O7ARuMPXccFuwKnADI/n53gbwy4DeTXwE/Aq0MfPerlYyYNzsyPwxa4oYWPYMMsw7dEjOKVSUyOSlydy1lni8FIMdceAyIkn2p6u8LjjJNNrfmZmphR26mQZ6tOnR/R2XXVNtbz9+9ty0qyTJOW2lDqjuOd9PeWmD2+SZZuWheU84aApyjdko1pE5IcfxOHjC8IBIg8/3CT5QzGQw6kz1UCOjQzxcB3+iIR8wXze7v7ibmEacvW7Vwd9jDf+dEGoeqIlG8hfln4pnIyYtKTI681mHOePkA1kqVeizTaGfawbjIGcBaS7Hl8EfBTM2upBVuIal+c26F/Qc+daH1Xw7a0EkZNOsj2do0MH34YYiOzc6dNT0hz+3Pyn/POjf0qv+3rVGcXJtybLibNOlP8u/q9U1VQ1+xyRINTXwvbLMiWl0XHesct270nde+kdLx4koRjIEkadqQZybGSIh+vwRyTkC0Zv/vueC6RgJPLczScGfYw3gQyxUPRESzaQf3xnpizrhNzYp03z9aaNUe39OvvUmwE8z/5ojoF8qN0W6Lgg1g0YYuE1PxnYGszaaiArcc2QISKheJA/+8z6qA4YII6sLN/G7imn2J7O55cDiIwZE9ZLq6iqkJd/eVmOfv5oMdNMnWG850N7yp2f3ymrt68O6/nihTolDpIFkpWe3uCLwu7LwNePnUh4QgJtaiBHHzWQm0YwHsSPpxwtAvLRGQcGfYw3TQ0BsKMlG8i/vPWMCMhPjsyQj/U0frOysiQrKyuw3vR15y0CejOYJL1rPbZ/Am8B04I4LhDfA/2NMX2NMWnAGcCbnhOMMT08nk4EfgvDeRUltriS9PKvuKJxhyJj6joU1eFOAOvRg/zp0xsfk5ZGPvhM0vNZg7JPH/j005DFt2Ph+oVc9e5V9Lq/F6e/ejrvL3uftOQ0nPs4+fi8j/n9st+5/pDr2b2d725LiYw7AeWFSy6hHNi4axci9R2urrjiikYJKQJ4v2OeHaoURWlMoM5uAEv278+U42HRIQODPsabRK3dG20qBg2g7xXwtyl9Qz62Tm++8ALl5eVs3LgxsN4UaVTqM1J6M6CBLCLHe2xHA0OAzc09sYhUA5cB72IZvv8WkV+NMbcZYya6pl1ujPnVGPMjcDlWTLKiJDYuA9k5cWLDTGSgoHv3xpnIHp3tGmQvY9VaLDj3XKtesY86yD6/HO64w3fliyDYWbmTZ+c/y8HPHMzgxwbzwDcPsLF8I0O7D+Xh4x5m9dWrKTy5kMNyDoto7eJ4Iu+VV2xbUW/cuNF2vkBcZKIrSqIQTAWHVXvsxoxRsHpQn6CP8aYpRnVrxLRpQ3FnWNux6bWefXUG9Kk3RaKiN5vSKmsFsHc4Ti4ic4A5XmM3ezy+ESv0QlFaDh5l3pxOp/XBXrIEBgyAtm0bz/dqd1x3TIcOsH07jB4NM2b4NHaDaq8cJCLC3FVzmTFvBi/98hLbK7cD0D6tPWftcxaTR05mVI9RrcYg9qZ0w4aQ5jscDoqLiyMjjKK0UOp0oA9qXW2PPbtsBjrG7hwQHr3ZkkkySSTXwLGflvBW7WUsP9Cq1muqaxg0+0skybDw5DF183M++4m267ZQMmYfdnS3mrWU2jWK8kP3Dpn8c8alLKtNolfnNmT8NJ8nP1/PuQdcRJvUNmG7toAGsjHmYSxHB1ge5+HAvLBJoCitDc9Oem78tYN2e5CTvX6hu5+79/sxSkP9cvBmU/kmin4qYsb8Gfy09qe68YP6HMSUkVM4bdBptE2zMe5bGb46XGVlZVFeVkaZR21p9UYpSmTI+nMtExdBtz2ad7O7uXqzNdB+ZzX3vwuHFW9l8cJHudT1kqdXQcXdUJEMh2fMqpv//nMw9k84avXLfLiHa40M2F7ReO0soAzwrMifAdy3rYx/vX4dC3ezxu54H+47CE4e6YyugYxVBshNNfCSiHwZNgkUpbVhZyD7awftNppTvD6u3gayr1bTTURE+LTkU56a9xSvLXyNXTVWQ5GumV05d+i5XDjyQgZ1s+vt03rJz89n0qRJVFbWdxJIS0tj+vTpsGsXeRdeSCmQ7XCoN0pRIsTQD37i8lnwSbuFcHaspWnZ9Os7kmEHncSajr9RObA7U0db3wlJ1TV8Nv5LapKTmDr6kLr5m1f+xGcrtzDmoH0Y0MfyIG87/hv+/eoCqkTq5iWlJDF1cA8q2qTyxB8b2LFhB+26tiO3fzf6dMpk4v6jGJKeSla7NDpX/cnZw3qRkZIR1msLaCCLyHOuJLoBrqHFYZVAUVob4fIgu48PwoMcCqu3r+a5H5/j6flPs3TTUmtpDMfscQyTR0xm4sCJpKekh+VcLRHxUPKez52nnILzwgut0BgNq1CUiLG2TxfeGAi12bvFWpQWj0lKYuwD/+HnFVs5pndHGvzkP8H6c7jnmKup4KEeQ0Vbivj37AugqqpuLNkks9e1d+F0OrnH5ryHAj+v2Mo+vTvWrRluArqcjDGHAUuw2kI/BvxujDnU3zGKovjBn4Ecoge5CMi5/XaSgJzZs5vccrO6tpr//v5fTpx1In0e6MONH97I0k1L6d2hNzcfejPLrljGu2e/y2mDT1Pj2A95eXlUeSh5gKqqKvKuu67+fQyzp19RlIbMPXJvTjwTlhwxrNE+be8ef/jUm0G0nY4kwYRY3AccIyKLAYwxA4CXgFGRFExRWixuD6Onx9dt/Np5kL2S9NwUVVSQC5Rt2QJAyc6d5ObmAgR9637Z5mU8M/8Znl3wLKu2r7JESUrhpIEnMXnkZMbtMY7kpKZnJ7c2SktL7cdXrfL5PiqKEl7cSXrJxktnFhWRm5tbVzHBXU4MgteZSvjxqTd9jEeLYAzkVLdxDCAivxtjUiMok6K0bMIUYpG3fbttSbG8vDy/yn5X9S5mL5rNjPkz+GDZB3Xj/bv0Z/LIyZw77NwWW6840vhK0svu2FENZEWJElJTg6mFJK9K477KiQXSmUpk8ak3Y1xzOqgkPWPMDKDQ9dxJw8Q9RVFCIUxJeqV2xjS+f3X/uu5XZsybwfM/Pc+m8k0AZKRkcNqg05g8cjJjsse02vJs4SI/P7+BhwogE8gfO1YNZEWJEic8+TH3vwmfbvsCDrqqbjxePZWtHVu9GQdVfoIxkKcCl2I16gD4HCsWWVGUphAmD3J2SgolNga156/uHZU7ePmXl5kxfwbfrPimbnz47sOZMnIKZ+1zFp0yOjXpMpTGNKqd2rEj+Vu24Bw0qP59VwNZUSKKiFALkOKlM+PUU9naidea08FUsdgF3O/aFEVpLmHyIOd37UrumjUNwizcv7q/W/kdT/3wFLN+ncWOyh0AdEjvwFlDrGYeI3uMVG9xhGhQO/Wuu+CGG6z3XJP0FCUqvJx7MIeP+plHjzuMsR7j8eqpVOKz5nRTOukpitIcwuRBdnbuDGvWkAeUAr369ObwCw/nrm138fOMn+vmHZJ9CJNHTObUQadqM49o436PPQ1k9SArSkSpS9JLamjixKunUolP1EBWlGhjZyC7H4tY+z33+TKskpNxYiUFPD1lNJdm/8wLNS/AOuiW2Y3zhp3HhSMvZK+ue0XqSpRAqIGsKFHHrtW0m3j0VCrxid7riwFah7GVY2cgG+Pbi+z2IHuEWKzavoq1FRvqnn+zZi6VNZWM22Mcr5z2CiuuWsE9x9yjxnGsUQM5bKjeVILliDd+4r9F0Oe7RbEWRUlgAnqQXXWPrwUcnvNF5IgIytVi0TqMiq2BDJbhVFNjbakelRRdhlVtkuHtxW/x1LynmLNkDt/urKG7a8qEvSZy0xUP4ejkiLz8SvB4GsiapNdkVG8qodDnz40csgS+WL811qIoCUwwHuRXgHnATViGsntTmoC/OoxKK8GXgewjUW/j9nUAPD7/KSbOmshbv7+FMYYOmZ3r5pww+GQ1juMROw+yJumFjOpNJRTembAXE86ENfsPjrUoSgITjKauFpHHReQ7EfnBvUVcshaK1mFsfTS6NVxZae3wriLhbh09aBBJSUl069mNwRcP5v4vrE70W6t3MjBrIPccfQ8rrlxB/64DGhyrxCEaYhEWVG+2PkIJqfGe+3HpJt4eCLt67BZFiZWWRjBJem8ZYy4BXgd2uQdFZFPEpGrBaB3G1oXtrWHXPqeXJ7GoutpqHb18OQAbVm9gwzMb2Lu/AYSzR5zLjZfOrC/P5mloqdEVn6iBHBZUb7YuQgmpsZu74vEVMAGSTta7NUrTCea/5zyskIqvgB9cm3bSayL5+flketWzzUxK0jqMLRTbW8NAHtQZT9t3bWfGvBncUFHeqHU0VfD9Issgzs7q17B2saehlaIFaeISNZDDQn5+PpmZmQ3GtH5tyyWUkBq7uTWVNbR7BzqsWB9ROZWWTTCNQvpGQ5DWgtPphBkzyPvkE0qBbCC/f39NNGmh+Lw1DHy76nue+nkms36Zxc6qnRixX2O5O2Z54MCGO9SDHP+ogRwWtH5t6yKUkBpfc3eWQ5dFJXBcWEVTWhEBPcjGmFRjzOXGmFdd22XGmNRAx7UEvOOaLrnkkrCUGXL260cxUHveeRQDzq5dwyi1Ek/4ugXcBTho5hienv80O6t2MiZ7DF1272K/Ro8esHQpnHFGg/GidevIwfoQ51x8sZa9ikdaYRWLiOlNp5Pi4mJqa2spLi5W47gF40tv2o37mts5DcqzezQa13KBSrAEE2LxODAKeMy1jXKNtWjccU0lJSWICCUlJTz++OMNnufm5tZ9uEL60InLVej+onR/cSotjvz8fNJSG/+e3Aa0XdyOaw+6lkWXLuKzCz5j+r0P2d9Gvuce2GOPBuNFRUXkLlpECSBAyfr1Df4flTihlVWxiKjeVFoN48ePD3rcLvwmOS2ZTRNg++D+Dcbt/j9Vbyo+ERG/G/BjMGNN2YBjgcXAUuAGm/3pwMuu/d8COcGsO2rUKGkujo4dBcv28Ls5HA4pLCyUzMzMBuOZmZlSWFhov/j554uAyJQp1t/99mu2vEr8sWLrCrn909slNd3+fyc7O7vRMYWFheJwOMQYU/e/ZYfD4fD5/6jEETNnWp/xc88V+fBD6/Fhh0XsdMBcaYIubq7O/Gn5FhHx/X8Zqt50rxcpIr1+tGSIh+vwR1PlC1W/eevN4ZcMF6Yhby56s1nrhotIvk/x8j8QCznCdU5fejMYV0aNMabOfWWM6QfU+JkfFMaYZOBRrAihQcCZxphBXtMuBDaLyJ7AA8BdzT2vPzy9GSVbgyswXlpaSt7114dWo9PtQXYnVqkHucVQVVPFG4ve4PiXjif7wWxu+vgmqnbZz13uqlbhSbC3kbXsVYLg4UEueu89KyTmk09ajLfUrTOHZXcmJyfHttKEHaWlpVrbuIVTtnUDa1b8xLLNy1i2eRl/rlpI6fxPKFn4dd3Yss3LKF3wKaXzP2HZxqX1Y370W8ni7+qP37iU0vmfMGZwbz6a/xFLNy7lo/kfMWr3FPptgtSqmkbH+1pXiU9ieZcpmNT3a4GPjTHLAIPVUe+CMJx7P2CpiCwDMMbMAk4AFnrMOQGY5nr8KvCIMca4LP6wUnTlleQ+9hhl7hq1QZKdnU2pjy8Fnx86DbFIOIqKivwmCC3dtJRn5j/DswueZc2ONQCkJqVy8t4n80XWB6zZuKXRms0pUaVlrxIEl4Fc9Mcf5L7ySl2VkpbQCc6uvJYxhmDUc3Z2thorLZiKHVvY3qc707NreXsFsBXS28LTO6G3Aw7zsCC2/gs6VEKHG2B7hjXWNQU2VDVeN1uEr07dn7NOtZ633QU77oAdqdDe43eVTLP+zh32Cww5sf541ZsJRaw7aAb0IIvIh0B/4HLgb8BAEfk4DOfuBXi60Fa4xmzniEg1sBXICsO5G5H30EMhG8eZqank5+eT3aGD7X6fHzo1kBMKX3FrM1+YyYs/v8gRzx1B/4f7c8cXd7Bmxxr26roX9x59LyuuWsErp73CvRfmkum1ZnNLVOXn55PZpk1Y11QigMtAzvvxR8p2NbyVkOjeUjsPsIg0LEVog/v/NJRELCWx2Fj8Gx9sr+XjX7G+tYFdO2EK8CZp9O3Ut25blZVKaVYKjk6OurGT+mXQxmvN5GS4qq2hokuHunmOTg5Ks1JYmZXaYM03R7Zl/h7t6T/+nAZraLnAxCLmd5ns4i5cHoAjXH9Pttt8HRfsBpwKzPB4fg7wiNecX4DeHs//ALr6WC8Xqz7zXLvYzkAYP/FyBsQBMhXEkZ5e97zwrLNERKRw/HjJ9DrGbwzy2WdbsYhXXWX9HTo0ZHmV6OHo3t32/6JLGrLbNQjTkDa3t5HzZ58vX5R8IbW1tQ0XmDNHCkEcGRkBY4tDofD558Xh/v/s3j0sayphZtYsEdd7ZKtbrBtiYYMQYpCbrTON8Rtj7P5fnzp1qm1cvcYgt9wY5JKVv0mbTN//G8EQbD6GL3y9Ns1dtyloDHLT8KVj3Hoz0jHI/kIsxgIfAcfb2dXAf/wcGwwrgT4ez3u7xuzmrDDGpAAdgY12i4lIAVAAMHr06JBDMLIdDttbL46ePSletap+YOxY2GcfuO8+GDECAOeAATBnDnnJyZTW1JDdrh35Tzzh+xaAepATitK1a23HN1fCPSW9aXfdTZwx5Aw6ZnS0X6CmBifgPOIIePvtsMnlPOccnOeeaz15+WXrf1OJL1we5OzMTErKGrWBiam3tNk608ftaofDQXFxccDj/dU2/nlFcDkgSnxS0yad8sb/7kDwITROpzMit9Ejta4SfmIdEuMzxEJEbnH9vcBmmxSGc38P9DfG9DXGpAFnAG96zXkTq5MfWB7nj1zWftjxeevl+usbTkxNBfctRLco1dU4geKBA6kFigN9ANVATghEhK+Xf02PFPuPSTZw9bCLuWj0Rb6NY4hOg4gQw4OUKOEykPMHDSLT6/1P9Fu74bhdrbWNWya1Umu5s2zQEBolWGIdEhNMo5ArjDEdjMUMY8w8Y8wxzT2xWDHFlwHvAr8B/xaRX40xtxljJrqmPQ1kGWOWAlcBNzT3vL5wOp0UFBTgcDgwxuBwOCgoKMB52mkNJ6amNqxtClDlyiZwx4RWV/s/mRrIcc2Gsg088PUDDHl8CAc9cxC57WobxxCnppIPgd9riFiDiKKiovpGIU5ni6iK0OJw6Qpn794U7LcfDlyZzm79ksAGoU+dmcDXpIQHs20bh/eFFC+VFw8/CrX2duIQax0TTBWLSSIy3RgzDitB7hzgBeC95p5cROYAc7zGbvZ4XAGc5n1cpLC99bJhQ8PnaWmNDWS3kZSR0fC5L9RAjjtqpZYPl33IjPkzeP2316mqtX707NZ2NybtlsSeW9aQt/vulK5da90KHj0a52uv1f848kcEGkTUZfe6nrsbhUDiVkVokXjoCmfv3jgBZs2C00+PpVRhw60zf16xlX16+7mLorQqzNp1fLQAHmifxPQufeKmPXisqyIooRPLkJhgvrHdKcnjgedF5FePsZaPdxc0HyEWQPAGstsg1jrIMWfFthXc/tnt7PHQHhxTeAz//vXf1EgN4/uP5z9//Q8rrlxBn3Y9rRCa//63/lbwqFHWAsF4kCMQYhHz7F4lODx/TLv/V1KC8UsoSuJS3S6Tp0ZC6v4d4yqERvWmEgrBaOofjDHvAX2BG40x7YHWY9HZGcjqQU5oqmqqeHvJ28yYN4N3lr5jxcsBjo4OLhxxIecPP58+HT3yR93vj6cH2P1/ESMDWWvIJgh2BrJN63FFaUlU79aV3InQt2M3Lou1MB6o3lRCIRgD+UJgOLBMRMqMMV0IT6OQxMCfB9lXDHKg2+7eBnJNsxsTKkGwZOMSnp7/NDMXzGTtTqsyRWpSKqcOOpXJIyZzZL8jSTI2N1Xc77NnfVe3FzCYEIsIxCDHOrtXCRJPA9n7zpGitFDcTodANbGjjepNJRSCCbE4EFgsIluMMWcDN1FX+rsV4P1l5ulBbmqIhbaajhrlVeUU/lTIYTMPY8AjA7jry7tYu3Mte3fdm/uOuY+VV63k5VNf5ug9jrY3jqH+/fL0ILvfOz/vdV0yyDnnkAMUBVH6Klhind2rBImGWCitkNrKXey+HTrvDO27LdIJdKo3lVAIxkB+HCgzxgwDrsZq1vF8RKWKI4pefLG+UgBQtGyZhlgkAD+u+ZG/zfkbPe/vyTmvn8OnJZ+SmZrJBcMv4MtJX/LrJb9y1YFX0a1tt8CL+QuxsPMgf/ABReeeS+4FF1jd94ASIPebb8Km8GOd3asESSsNsdBKAa2b9N//YPV9UPhI8KELvjqWhvN/R/WmEgrBGMjVrtrDJ2B1unsUaB9ZseKDug8s1Bs5H3xA0U8/WRO8DeQ4K/PW2r6ktu3axpNzn2Tfp/Zl+JPDeeT7R9hSsYV9e+7LkxOeZPXVq3nmhGc4qM9Bod36szOQfXmQ16yBY44h74UXKPMynstqasKaDKI1ZBOAVuhBjoahEylam86MFLXJSaxuB1vaBf+/Hq0EOtWbSrAE89+73RhzI1Z5tzHGmCSg5btA8PGBra4m78MPrXJNbkPXbQjFkQe5tZSzERG+Wv4VM+bP4N+//puyKut6O2V04pyh53DhiAsZtvuw5p0kFA/yxo0ggi+/iSaDtDI8DWT3/0oLN5D9GTrxrHtai86MBmUD+rL3NbBXl378FuQxmkCnxBvBeJBPB3Zh1UNeg9US+p6IShUn+PzAbnWFYMexB7mll7NZv3M99399P4MfG8whzx7CzAUzKasq47Ccwyg8qZBVV63ioeMeCso4Dug1cr9fdkl63u+1ywjK9nEbXZNBWhktOMTiu5Xfcco1fSjeLY1lE3vR/+H+9H+4v20SFFgGZ/FuaVyU27Nu7kW5PSneLY1nD+9UNzb03j3YdaSD7RtWRfV6WrrODDf+9Ka74a3xlddhgy/dqDpTiRUBXRkissYY8xrQ3zW0AXg9olLFCT4zXjt1gi1bKPr5Z/JycigtKSEbyP/N+q2c9+23lCYl+S6MHgUDuSX+Gq+VWj5Y9gEz5s1g9qLZdc08urftzgXDL2DSiEn0z+ofYJWGFBUVkTtlCmXl5YDLazR5MuDhNQqlzJvLQM7v1YvcdesafOFmpqRoMkhrowWHWJRXlbNh4wpy1kNJZhVLNy21dnTENo07KxW+XF9FYeFqysqteV0HwJfr4bovt7Lhk63QEQ7vC6N/h3nvFDHynGujdj0tUWdGikDe9qZUscjPz2+wJmgCnRJbgmk1PQV4FXjSNdQLmB1BmeIGnxmv48ZRBOT+738NkrAueO01JgElu3b5j72LgoHckn6NL9+6nNs+vY1+0/sxrnAcryx8hRqpYcKACcw+fTbLr1zOHUfdEbJxDC6vkcs4dlNWUUHetR5fzP5ikL1DLCorAXD26GElg7Rvb7UWBgqOPFJv1bY2WnCIxb699uXp236k+Nv3qHp6Dr9f9ju/X/Y79951L20y0hvMzWiTwbEnn8yUjHTLOAbYCnMXpHBBagobqurHvvoJHsiEqozovk4tSWdGmkDe9vTflvD9k/CvF4L/caEJdEq8Ecz9j0uBg4FtACKyBNgtkkLFCz4/sKNGkYcVj+xJVW0tlV5r2N6ii4KBnJ+fT6Y7JtpFZlpawvwar6qp4vXfXucvL/6FnOk53PLJLZRsLSGnUw7/d/j/Ufr3Ut468y1O2OsEUpNDu2XteWvQ1+3g0jVr6p8ESNJrcKvxlFMoAkhNtZJBLr+cWqAYcA4aFJKcSgvA9T9TtHYtOb//blXDGTeuRSR/ZaZmsmefoeTsdzTdBx5E/6z+9M/qz9UXXc1TM55uoDdnPDWDL775gfKKXQ3WqK6qpqqqoR7dVQtXpcKm4XtF83K0BFgAgtKbLm+72bmT0auh79pdtvN8hWdoAp3iJi4SZkXE7wZ86/o73/U3Bfgp0HGx3EaNGiUR5Z57xFiFLYLajDENjx8/XgREioqsv+3bR0TMwttvFweIAXGAFF52WUTOE04Wb1gs1713nex2z27CNIRpSNr/pcnpr5wu7//xvtTU1jRr/cLCQsnMzAz4njm6das/yOGw3qc//6wfe+cdEZDCIUMarZcJUjhokDXvttusY0Hk6qubJbuSgHzzjRSCZBrT8H8kM1MKCwvDfjpgrsRAZ/60fEvAOcbrNQi0vbX4rWbJ1BR5CwsLxeFwiDFGHA5HRN6jQDJEe41gCFpvOhwiIvL1b+/LqCnISf/cJ6i1IvF5iNZrEwyRlCVerjOccgT7PxKuc/rSm8F4kD81xvwDaGOMORp4BXgrGOO7xZKURCg33RrdootSJz3nuHEUQ70H8+CDI3Ke5lJWVcYLP77A2JljGfjIQO7+6m7W7VzHoG6DeGDcA6y8aiWzTp3FUf2O8t3MwxcicMop0LUrdO1K3rnnNro16E0mkO/pufDjQc779dfGtxqBvGXLAChauLC+jvZTT7UIz6ESAu3aWXeb3J95F60x+SukUIWOUFMb/Q6j6sG0xy6kwhtPb3t1ZgY/9II/e2Q2mhdMMmRceA+VmBEvCbPBWBvXA+uBn4GLgDlY3fRaL0lJ5GMZUp6kpqaS5pWhbnuLLlqd9LwN7zhraT1/9XyOvuZo2u3WjnOHn8tnf/+M1F9TmTR8El9N+opfpv7C3w/4O10zuzb9JDt2wH/+Y5Vf27iRUj+vtTEGR5s2FOD1Y8LOQN5zT0hJodTL8HFTWlFhJbK89lp9He1t2xKmHqwSJgYN0pJ/LuxCGFJTU0lLS2swlp5kuL8Sun7+QzTFSxg8jcdxB+wTFX3i73/VLl64PkmvsYkRKBkyketoK+EhXhJm/RrIxphk4DcReUpEThORU12P7a2C1oIxOIECrOQrAzgcDp599lmeuemmBmO2SQbR6qTnXWEhDjr2ba3YyhNzn2BUwShGXjaSDx76ANniej22QsrbKRyx4wgO7HNgaM08fOG+5nbtYP16snv3tp3mAGqrqymeMMGqce35WtkZyDk5sHIl2T162K6X3aaN9SvYu1lIK/QctmqMIdvhsN3V2pK/7HI6nn32WZ555pkGYzfmdOTKckja6d9j2RrxNh5Xr1weFePR1/+qw+Gw9banLV/FLR/DxK/XB72WezxevIdK7IiXhFm/BrKI1ACLjTGtS5MHwmUoObFCF2ofe6xOQThPOskaGzTI9y26aBnI3h7jGBnIIsIXpV9w/uzz6XFfD6a+PZV5q+eR9FESeBWBKC8rD68idF9zSgp07Ur+nXc2TsQB8sF6X91GsOdrZ2cgA+y2G/n33ENmesOM/Uwgf/jwuPkVrMQWTf6qxy6EwXts5XUHs8flsPKgfWItbtwRK+Mx1P/h9OWrmfYpHP/1upDXUr2pxIvODCbEojPwqzHmQ2PMm+4t0oLFNd6GktvQhfpmIRUVvo9vJQbyup3ruPere9n70b0Z8+wYnvvxOcqryzmi7xG8ePKLyFYf4QnhVITua3a91nVerB49LC9/crIVUuG+zWv3ntg1CnHhdDop8LxrkJVlrde/f9z8ClZii5avCo1tWe1Y1gWq2qQFntzKiJXxGOr/cFnPbtw6Ft4+sHvIa6neVOJFZwZTaPKfEZci0fA2lDwM5KL//Y88oHTZMrJzcmLWKASIiYFcU1vDB8s+4Kl5T/HG4jeorrXCPHZvt3tdM489u+wJwI3ZN9o3YgmnIrTx/jqdTpwHHGDFEXftCmvX1jf+sEuc9OVBduNZTs/93qamauF7pQ63p1Sxp6ioiLy8PEpLS2mT1QYOhZqT4itnIh7w2bwqCsZjKP/D5X12Z9rhsH/PntzsYy2g7j13e8CdTqfqTQWID50Z0IMsIp/abdEQLm7x4UEuKioi97rr6pOyAjUKSUqiCKwqB5HI1o2igVy6tZRbP7mVfg/149iiY3ntt9eolVqOH3A8b5zxBsuvXM6/jvwX377zbV2CyY4dO4JLamwOvoxb93ndStidMBlKiAWu9/zmm+vf802byAWKXLeP4+FXsKLEM95xtWUbykidDQse/4/fY1pLlQPPa92xY0ejpMZ4NB7rkvSwzyPxl4inelOJG+xqv3luwHasJiGe23KsdtP9Ah0fiy3idZCfeKK+ti2IPP+8iIg4HA6/tSHrOOIIq4buDTdIptfcsNaDfPvthnI+8UR41nWxq3qXvPrrq3Js4bFippm6usV9H+wr+Z/ly4qtKxrMt6ttmJqcLFnuWs2dO4e/7ujKlda19+jRcHz1ams8Kcn627WrNT5pkvV8xoz6uZ06WWObNjVa3ud7HqHa1oriD+K4DrIvfH2Gundsazs/HHV046F2bDAy2OrM1FTJysoSY4z06NUnorWam8r7816VkbnIafkH2O4P+ruyGcTDe+xG6yDH9zl96c1gYpAfBK7FajHdG7gGeBGYBTwTmjneQvD2JLqe+4oDKykpISUlhUsuucQacHmQ8555Bu887bAmXETIg7xowyKufe9aet/fm1NfOZX/Lf0fqcmpnDHkDD445wOWXr6Uf4z5B7069GpwnF2CSVVNDe1w1Wr+5z/D7yXw5f11e2E8k/g853m+dn5ikH3GBO7Y0RRpFaXV4esztHbrznqd6UFrqnJgqzOrqmjXrh21tbW8+83PcelZ7fjDr/xQAFe9tMR2vybiKYlAMAbyRBF5UkS2i8g2ESkAxonIy1gJfCFjjOlijHnfGLPE9dd2HWNMjTFmgWuLn8RAHyEW/uLAampqePzxxy2F7zK4Stc3LoEDlkEdlluHYTSQy6rKeP7H5zn02UPZ+9G9uffre1lftp7B3Qbz4LgHWXXVKl465SWO7Hekz2YePpWi+0EkqgcGCrHwfm4XF+4nxEITShSlefj7rNTpTA/8OSJaWshFohqSVZkZzNsdVu7WuFEIqN5UEoNgDOQyY8xfjTFJru2vgLtEQ1MtmhuAD0WkP/Ch67kd5SIy3LVNbOK5wo+PJD270iTeFBQU1Blc2bvt5nOehKNAehgM5Hmr53HJ25fQ474enDf7PD4v/Zy2qW2ZPGIy31z4DT9P/ZkrDriCrMysgGv5VIruB5E0kD0rjUC9B9lNE2OQ46UcjaIkKoH0ZkFBQYPn/oyosOjNOCJRDcmNo/Zm1MXwkHOQ7X7Vm0oiEIyB7ATOAdYBa12PzzbGtAEua+J5TwCecz1+DjixievEBh8eZM/kAl/U1NTUGYL5kycHNKibdeuwiQbylootPPb9Y4x8ciSjCkbx+NzH2bZrG/v32p8Zx89g9dWreWriU+zfe/+Qmnnk5+fb1wwOUb6Q8ONBrkuQBHKWL7e+UEOsYqEJJYrSPNyfIV/UeOmxYBwRLSXkIt4MyWCTI8XlO/P1/aB6U0kEApZ5E5FlwPE+dn/RxPN2F5HVrsdrgMbFEi0yjDFzgWrgThGZ3cTzhRc/dZDdpUlSUlIaKXZranKdgew85hjYe2+r1E1JiU93fJNvp4XQalpczTyemvcUryx8hYpq6yZBlzZdOGfoOVw44kL26d68wv1OpxN+/ZW8O+6gFMtznJ+WhrOy0i1Es9a3xX3NXu9Z0UsvkQt1MeAl1dXk5ubCmDHBddLzIB7K0ShKIuN0OjnvvPN860yvuVBfIkx8tXuP8zCEYPC+1uzsbPvSoVHAXXnCHRPt9tR7yunGXcUiyY8PTvWmEu8E9CAbYwa4moT84no+1BhzUxDHfWCM+cVmO8FzniuD0Jdl5BCR0cBZwIPGmD38nC/XGDPXGDN3vY/Y3rDhpw6yG7fisB33SPqq6yJ14YX48js3+XZaEB7ktTvWcs+X97DXo3tx6MxDeeGnF6ioruDIvkfy0ikvsfKqlTx47IPNNo7dOI84wuo0iNWFsM449iFfs/Fh3Obl5dknSH71lfUkyCQ9RUlUoqozg8CvzvTCs/uerzt28R6GECx23QdjQSjJkd0++Z6V98I1z/4cLfEUJewE0yjkKawqFk8CiMhPxpgXgdv9HSQiR/naZ4xZa4zpISKrjTE9sMI37NZY6fq7zBjzCTAC+MPH3AKgAGD06NERcEV64K+TnovHHnsMsOLnampqSAZy+/Wzxg8+2JrkaXAlJZEPDbya0MzbaT4M5JraGt774z1mzJ/Bm4vfrGvm0bN9z7pmHv0692vaOQPhzwiOYpKez+SX7dsbHudnDUVJZKKqM4PArTOfePIJpFYwSYaLL7q4btwX2lgiOoSSMJhUUUnPHfBHWVWkxVKUiBHMN36miHznNVbdzPO+CZznenwe8Ib3BGNMZ2NMuutxV+BgYGEzzxsegjCQwVL41dXVyCuvUA08Nny4tcPOI5mcjBPr26qubXF2dvPisrwM5M07N3LLx7eQMz2H8S+O5z+//QcRYeLAibx5xpuU/L2E24+4PXLGMfg3gqNoIPtMfunQwXoQSic9RVHCwmOPPcY1/7sGpsEdn94R0DgGjWeNFqEkDK4aM5yeV8GDF4yItFiKEjGC+cbf4AptEABjzKnAav+HBORO4GhjzBLgKNdzjDGjjTEzXHP2BuYaY34EPsaKQY4PA9n7Vnsgw8k78cvOQHat4YT6EISFC5un5L0M5Hu/uJvbPruNFdtW0K9zP/51xL8ovbKUN854g+MHHk9KUjA3FJqJl7HZIFHu7rvDn3nuo4qFz+SXww5reJyNzIqiRI5kY31W3XGswRAvYQjRwDNRbtwB+0StWkcoCYPV6Sms7gA72qc32qcoiUIw3/iXYoVX7GWMWQn8Hbi4OScVkY0icqSI9BeRo0Rkk2t8rohMdj3+SkT2EZFhrr9PN+ecYSVID3Kj+W5Dy4+B3IDqpjvq73niHrpdfblleGIZoqkmmbP2OYuPzv2IJX9bwo1jbqRn+55NPkeTcF97mzYUYYWU1LVp3ro1/OWZfCTp+fQ67bNPw+M8vdoag6woEefIwi8pux32f+GjqJ873ltYe7doXr1yedRK2oXiqXdXsfCXpKco8U7A/14RWeaKJ+4G7AWMBQ6JtGBxTagGcgge5AZUhRa/tbNyJzMXzGTAlAFcd/l1bNheYRmeWIaoo/14ik4u4vC+h/ts5hFx3D8SMjPJg8h2EvQ8n48SbY28TsG8V4qiRIyUWmhTDaaquZF8oeFtfMZjPeVYdxEM1lPf+cffeeItOOazkqjIpSiRwKeVZIzpYIy50RjziDHmaCxb5jxgKfDXaAkYlwRRxaIBwXiQ7dYIwoMsIvyw6gem/ncqPe/vyQVvXMCSV5aAl21dBtz68WcB14s47tdg+HDsUz4aJ33YeXWC9vSEGh7h/V5peIWiRJXPzxlL5j/gM2d0/TCxNj6DIZREuWbpzWbSrmQ1F/0Aw3+LfXUURWkq/oJOXwA2A18DU4A8rNyxk0RkQeRFi2Oi5UH2YyBvLt/Miz+/yIz5M1iwZkHd+IG9D+TrbV/bHlO6dat/OaOBR4hFtsNBSUljD4Nn0odd7c1JkyYhIlS5POz+6nGGbOB6v1dqICtKVDHp6ZSnQVVSdAtrJEJb5+zs7IA6E8KgN5vJ+iF9uWgCdB3Sl8PDurKiRA9/3/r9ROR8EXkSOBMYBIxr9cYxNN+DbGd0BWEgiwifFn/KOa+fQ8/7e3LZO5exYM0CstpkceUBV/LL1F/46sKvcGT7qAvqrtAQSzyuPZikDzuvTmVlZZ2Sd+PT09NcD7KGWChKVHGHf9XU+m5sFAkSoa1zsIlyzdabzWRrdncKRsPPQ3qEfW1FiRb+PMh1nyQRqTHGrBCRiijIFP8kJVGE5VIvBbInTiT/3nt9/wp3G9BNDLFYs2MNzy14jqfnP82STUvqdh/V7ygmj5jMiXudSHpKfbawbV1QqK/QEEu8mqQA5F16KaVbt5LdoQP5jz3W4HUMxXtjO9ftCQ70I8aNepAVJWIUFRUF7Ao38MvFfPYM/L54Ns932xuAjn+sJGvhn2zt25ONQ6wylKk7yunz8Q9Utc1g+RGj647v89EPpO4sZ/lhI6lqbxmTWb/+ScdlK9m4dw5b9+xNujjYp/fYBudNhHrK3p31du/Zm3vuuqPRa9hsvdlM6jrpxSrXRVHCgD8DeZgxZpvrsQHauJ4brAZ4ceCOjA1Fn33WsE3xmjX+b1W5jasQQyw+XfIB03+4jrd+f6tBM49JwycxacQk+nbuaytfnRKdNInSykqy27Qhv7wc5157hXSddgTzBecXL4PT6XTiLC6Gm26Cyy4Dr7V83VK0w9bT01QPshrIihJWgm1V3HX9TsaUwuy9FnH/bKtc/t+/hgfehQcOgKuOtebtuRGWPAxLusAR2+rP89vDsNdG2OtSWNzNGrv7Pbj2K7j2aLj3YEhPzmD83uton96+7rhItnW205tDx05o0lqeLZp/XrGVfXp3bDSn2XqzmWSu3sBfFkNO+pawr60o0cKngSwiQbrcWh95zz/vs/qCXwM5xDJvl701lV+6W3VBR20YRel/Slm9ejUvZL/AXvl70ddpbyCDS4nedx/Mnw8nnACzZjW7lXOwX3B+sbt292Mb+ey8OmlJSUhtbYM8xExj7D09TYxBLlq4kLycHOsLDcivqaHlVlZVlMjjLwnOU38MuuxW3l34G6nH7cE5fToB0LN6JV9UFJMxvAfnDLU8yB03l/PF2Hls65TBOUNH1R2/dMw8Nmwux7ErixWPLmTnhp3c0S6d7Xt1YPd9h5CZ+i1lVWVsrtjcwECGhsZnuPClN/9553T2+dvkZq29sXw9K7Zth/JykjdtQTLSqc3qwtU3Xc31l19PeXl53dzUtFQQGoRZtGnThqtvupqVqxaTtHUbtZltkM6drJ3V1SSvXY8kJ1G7e/e6Y5LWrcdUVVPTLQvS0gAwW7cxe9Zr3DH9cVatWkO39hncvw26r/4dbmjWJSpK7BCRFreNGjVKIokxRrBK9zbYjDH2B3zxhQiIHHig9XzoUOv5/PkiIlJRVSG/XHyKNeaxHX9tb7nj8zvkkRmPSGZmZoNzpaWlSVZWlhhjxOFwSGFhYePz7rOPtda551p/r7oq+Ivcvl1k8mSR44+v2xxt2thet8PhCH7dWbMsWf761/qxO+6wxq6/3vaQwsJCcSQliQFxgBQefLAUgjjS0qzrByns1Mn+fB99ZK192GHByffgg1IIkpmU1OAaM8H+NVaUOAKYKzHQmT8t3xJwTih6M5j1/FFYWNhIZ2ZmZsrUqVMlK92IAenZo3tUPtMOh8P2unv06tOsde/76j5hGsI05MTTre+M/+xF3Zg50dKXBoSOCCdb224p1lhGpmtsGjJ1vHX8o6Prj+99pTVW2qF+jGnIgu7W+NCL68dOHWjpSM/rSzfI5DH9wvQqhk5z/4fCSSRliZfrjIUc4TqnL70ZhdZpLY9gM4nr8OFB/mPzMh5993me//F5Llm0kdtc0+vim+9dyU9P3cWOrVsp82rDXFlZycaNGwE/nly3p8D1Kz8kD/K778KMGQ2Ggi3L5he3DEF6kMHl1bnySljvKhnUqZM1fsAB8Mor0L07pKb6P1+wHuQOHaz6zF6ylIHvOwSKogQkZL0ZAt4hDDt27LD1Vj/xxBOIS5euWr02YlUcPPGlH9esWtGsdZf+8hk5m6EyqxPt2iezuuNmKjpk0Kt9ZwCSDxK+/ngNNUmGA27ave646SWbOGjpLq44swtf9bdyV9I67GR1x23UdMykV3srZGO32hpWd1zHxg7J9Gq/W93xWztsYHVFFV3ad6VXe0vvvl+6ijIafkftEvjPkm081ayrVJQYYmc1J/oWaQ+yL++ET2/Et99aXszRo2XHrh2yac9eIiD7ePwCf/j47iJgeS9tvA3BbI08uXvuaZ330kutv5dfHvxFPvWUdczRR4u88YbIG2+Io1s3+/P26hX8ukVF1rpnnlk/dvfd1tg11/g+rkuXutfHkZZmeZMzMqSwoMA6tmNH++Pee8/af9RRwcm3fbvlcQnlDoGixAnEsQc5FL0ZimfIbt1m6c0wEykP8tf79hAB+eoBP3pTXHfgHA7/dxubSch3VaNAvHhWRdSDHO/n9KU3NfOoCYTSchNAXB7Sks3F9LivByu3rgQgMy2Ti0ZdxPdTvufS/f8GYNtdLlgaeSrcZeLS0ykCcp59NvgC8dtcWS+DB8PEiTBxIvkPPNC4xBCQf/XVwQtp59F1e5C9vOTex9W1pq6stDoEVlSQe8UVFIHvroOhVrFo145sh8N2VzyVe1KURCNUvRksdrHNoeDvDlg4Gmv4Ks12+fU3h7yWJ5vbp1DcEUxH3/ny0eoO6Es37t6zd1jPoyjRRA3kJhJMy83N5Zt5+NuHOWO2tW/zjg1sr9xO29Q2AHx0/sc8MeEJRvccjXEZcM0puNNISbmMxqIlSyzDcvv2Bkrykksu8a383QayR+3kRl9wKSkUAM6//CV4Id1GcAghFu59tq2py8vJA6is9HkcEFIVimBrjSqKEhrBtioOhWBDvIyPWua+jDs743LSpEl07do1JIPZ1w+Dv5x0WlBy++L+8wfS90rYfugBPudEqztgpH4EKEosUQM5zIgInxR/wtn/OZse9/Xg8v9dziJX7eLd2nTl10t+pW/HHAAy09rWH+gykH35KLM6dsSBVWMvKz0d74hbWwPO5UHO++wz26obTzz+eEPPwgUXUHT++fDYY/DFF9ZEr+YiDb7g9tzTquxQE0JBf39NUvx5kGtqfMdAg3Wtdsc3wUCOlKdLUZTw48vAzcrKavAZvvjii0P64eur2cbGjRtD9sZG4ofBrupdAKQlp/mcE63ugJH6EaAosUQN5DCxevtq7vziTgY8MoDDnzucop+LqKyp5Jg9juHucfcC0DNzNwZ1G2TvRXUZcPlYYQueZGZmMv3aaykGaocPZ8Nf/8qzgCMlBQM4OnakoKAAoKFHeMcOAErd3mAvvM3Jsqoq8p57Di69FD780Brs2tX3Rae4cjz9tMRufFI/HuQAIRa+fjzUjduFWTSxjnEkvtAURQk/vryX06dPb/AZfuyxxygoKKB7WjIG6N65Peeddx55eXm2HuFgjMhIdaILhl01loHs2STKm2h2B1SdqbQ01EBuBtW11fz39/9y4qwT6fNAH2788EaWblpKr/a9+Oeh/2TZFct49+x3GTfgOOuAIFpNO4ECwNGjR0Pv5YQJ9cfW1uIEigcOpBYovugigMaxZjt3UgRk9+oV9DWVAkydam033QSnnOJ7snfXuWDw50H2F2JRU2P9eLDzAKWmWjHWe+7Z+ItOG30oSosmlDs+TqeT2yeN5pHR0GV0JU/MeKKBzjzngnPocnYX7h7fkZ6NXAj2lJaUsKpzCoP+1Ys+D/ShzwN9ePrQ9qzqnELu+Vl1YxdM7sqqzim8cHA7Rj45kjU7mlfF4s5HFvHTY9Dhz9U+5wQKFwtHjLWitFTUamgCf27+k39+9E9yHszh+JeO543Fb2CM4aS9TuLts96m5O8l3Hb4beR0yrEOCLFRiBMofv/9hr/EPddwr5ORYf3dsoW8KVMax5phJf3l33prIyVpH42HlaD22GPW9n//B+3a+X4hvDzIQSlbf2XeAniQnUDBY481+iIkJcWKsV6+vPGtT7fxrgayorRYQvFe7jzvTC6dAL99twupaqhzpErY/N/NsHUbdwmkBKE2egE9t9SwatsqVmxbwYptK0jbuoOeW2oo37apbmzn1o303FJD+padzF8zn69WftQsAzV7bQX7rIM04zsB2d+Ph2gl8ClKwmJX2iLRt0iUeauoqpBZP8+So54/qkHR9P4P9Ze7vrhLVm9f7fvg33+3So3tsYf13F1+bfHi+jkPP2yNubeFCxuu8csv1vigQSKnn249PuQQ6++AAT5LkwHiyM6WqVOniqNtW6s8WlaWTM3KalROzm+pOjv22886/zffBCzhVFdqCFezD8/GHe5rv+QS3+dKSrLmVFc32uXwaupRd93t2okccYR13CmnBH9dipKgEMdl3mK5njcf//67z9JkuMqT9eqxu5xzzunSq08vMcZI5y6dJTUlpcG8Nm3ayMN33Sorf/lGSjcVS+mWUindUiorlv0oK3/5RpavXFQ3tnzVYln5yzdyVeG5wjTk2GtODk5n+ijPNvaffWSfi5GlK39p0mvgq/xcOMvexbIEWbyUPxPRMm/xfk5felMbhQTg13W/MmPeDF746QU2lluNOTJSMjht0GlMHjmZMdljfGZH19GUVtPeZcn8eZDXrycbaFyC36KktJTnnnuOglGjcH7+Odx7L9x3Hwdv3Ehejx6UrllDdnY2+fn5ocWNeXiQ86691m+2dINWq0DuF19AUVFD77gvD7KI31CJUh+hGaU7dsBHH1lPunUL/roURWnRZLXZzWfjErAcRytXr+G1195qEK7h3ZDEp87s2MdmDOgBOUve4OSF8OH/3qasbFeDKWVlZVx7w7Us37qcW6+5lYryCsBqBjV5ymSWb13OCQfvS/LmLaxLruC33SGtre8yb/6IVgKfoiQqaiDbsKNyBy//8jIz5s/gmxXf1I0P6z6MKSOncNY+Z9G5TefgF/SO1Q3GQPb13NNAbmOVi2PzZvKB3ORkynzEA5eVlZE3b55VdaK2FqqrcQLODz+EvfcO/lo88biu0tX2cXAlJSWcd9551HjJVVZdXd+ZLlCIhefrZfNjJLtnT0pWrWo83qUL3Hmn1Unw+OODuyZFUVoF+fn5DX642+H+ke82gp1OZ7OTz4bPW8Xf/g1J7LLdv3rFam689MZG4xXlFdz4jxtpsxdc8S0cfSz8doDlsGkKkexsqCgtAQ3MdCEifLfyO3LfyqXHfT2Y/NZkvlnxDR3SO3DxqIuZO2Uu8y+az6X7XRqacQzBeZC9Pcb+PMg1NVZS2ocfkgTkuKYUHH44Dh9NLgBKd+6sX8Nd8SGlGb+RPDzI2Z19vybexnGdPG5PRaAkvQBxxPl3322fiPLQQzBlCpx3HnTp4lM+RVFaB+6Y32HZncnLy+O8886ri8/1Rbg9qgPO+Tvz9+pEhzZN+PrdCrJ7d5b0TCeze29OGXgeXTP9VBryg9Z7VxT/qIEMbKnYwrAnhrH/jP15at5T7KjcwSHZhzDzhJmsumoVj094nFE9RwUOpfCFy9gt2r7dSsj4809ygKI336yfk5RkGb1Yb0rOmDENkyU8jMii0lIrKa2szOooh9VhjowMiouLcfgq7eNOuKupqTeQU70rKod+XdTUkH/00Y3K0wWizlMRyIMcoBKF1i1WlJZJoCS2UJLc7JLSnnvuOfLz86mtrfXpXAi3R7V7/+GM+G0zN9z1ZCMDNRAOh4O/z15D/5UV3DFzObccMr3J30uqNxUlAHaByZHegNOAX4FaYLSfeccCi4GlwA3Brt+UhJNRT46Sbnd3k2vevUZ+W/9byMf7ZdUqKYTGSXFt2tQnZEyZ4j9pbtkyK9ksJ0ccbdrYJ1d06mSt5Sthzp2w9thjIj17Wo9XrGj6dY0bZ63xzjsi06ZJIYijY0efiS8N5ElJqb+2ggJrnQsvtD/Pzp3W/oyMpsuqKK0AWlCSXjCJv/72exMoKS3U9cJ1je5EvIA600aWeEnQ8oUm6Vlokl58n9OX3oyVgbw3MBD4xJeBDCQDfwD9gDTgR2BQMOs3Rdkv27RMdlXvCvm4oFi7Vhy+Kky4lLMjK8t/RnFxsfV2ZWf7rFhhjKk7pW0G9CWXWGs88ohIt27W4zVrmn5df/mLtcZbb4n84x/W4//7P3Gkp9vKlwz1VSyOOaZ+nRkzrGMnTbI/z/bt1v7MzKbLqiitgJZkIAcyaEOtwuDLCA2oNyOE92vm63rc12QnS7wYR75QA9lCDeT4PqcvvRmTEAsR+U1EFgeYth+wVESWiUglMAs4IVIy9e3c12/LzmbRqZPvNsmu+LbSTZv87vcMscjOsE/K8LwVaFsX1DPW1939LkwhFlRWWo/T08nv169xN0DgOaxbBsWA0zMxMNgQC++4bEVRWiyBqiyEWoUhmK5ysewG5ysmuLCwUDvTKUoMiOcY5F7Aco/nK1xjiUdaGtl9bMr+UK+cA+33NG7z99zTth11wOQKTwM5zEl67HJlZKel4ezZ0+oGiNWQxIHVHbCBeg+lk542+1CUVkcggzbUNsrxnpSmMcGKEl9EzOIwxnxgjPnFZouIF9gYk2uMmWuMmbt+/fpInKJZ5N9xh1/lnP+vf/lX3h5GpHP33S0DdLfdQlOkdgZyBDzIJCVZ3QDx8Bh7HxtKJz1tF60oYSfudWYAgzZUgzcRDNBYerAVRWlIxCwOETlKRIbYbG8EucRKwNOt2ts15ut8BSIyWkRGd4vDphCBlHNA5e1VB9kJFL/4YmiK1C7EIlweZLeBnJYWnCHrOSeQgez2IGuIhaKEjRavM32sWVxczI+lm9UAVRTFL/Hskvse6G+M6WuMSQPOAN4McExcE8g74He/XaOQED2qRYsWWWXkrrmGHFct5WYZyMnJVmm6yy8n6dlnrdJ1338fnCFr1yTFV4iFepAVpVXSLJ0ZJkIpJRfKmuMO2CesayqKEl5iYnEYY04yxqwADgTeNsa86xrvaYyZAyAi1cBlwLvAb8C/ReTXWMgbFzTTQC4qKiL3vfcogQa1k4tefLHJIhWVlFj1mDdurF/zmWcosulq14hQPMiapKcoSgywq52cm5vbLIPWvebqlcvDtqaiKOEnVlUsXheR3iKSLiLdRWSca3yViIz3mDdHRAaIyB4iEh+ZFLGimQZyXl4eZe6wChdlrvGmkjd/Pt5NWssqK8lb7FGgxJeMdjHImqSnKEockZeX16gVtbv9dDytqShK+FGLI1FopoEcakmkoNZ0t672Hi8vr3/Spo39wXZVLDRJT1GUOCIiejMCayqKEn7U4kgUmmkgh1oSqVlrehrFrprNDdpoA0W/ekTLaJKeoihxSFT1ptd4JGKfFUUJHjWQE4VmGsj5+flkepV0a24NUJ9llvbZp36gTRuKsOKdG8Q/z5lTr/ADJOkVzZ5tGdfFxfpFoShK1IhE7eRg1mxu7LMa14oSBuza6yX61ty2qXFJWZnVbjkjQ2T0aOvxd9+FtEThySeLw93uuWfPsLRRtW3NevrplnwgsueeAdtsyyuvWHNPOaV+4V9/FXnySSmcNEkyU1MbHJeZmRnRFrCKkqjQglpNR5JQ1o9E++nCwkLp0auPzzWDbaNtdx2FhYWSmZkZFzpTW01baKvp+D6nL73ZjBpfSlQJQ5k35/DhOP/zH+vJJ59A//7NFsvpdDYurfT22/WP27QJ2GbbNklv/HgoKSEPGicCuhJatIapoiiRxlbHhWHNoWMnsE/vjrb7mxOn7C8JUHWmogSPhlgkCmEwkBvMb07940B4xgonJ5PtcNhO69KlS0O53DHItbXg+iIIaFwriqK0MHzFKSclJQUMl9AkQEUJD2ogJwqeBnJTy55Fy0D2qlCRn59Pqk1L6+3bt1NUVETRZ59ZMcazZ1vxcs88YxnL7dr5NK6bkySjKIoSz9jFKQPU1NTUxSL7ajYSicRCRWmNqIGcKCSSB9nzPMnJOJ1OOnTo0GhaZWUlV1xxBbmPP16fwFdSQu7ll1td/jp1ikiSjKIoSjzjbqOdbFO5p6yszNKbPpqNqM5UlPCgBnKi4NlYo6llz2IRYuE656ZNm2ynbty4kbJduxqMlZWXkwfQqVPdF4XD4cAYg8PhoKCgQGPpFEVp0TidTmp9VPbZuHGj3zhj1ZmK0nw0SS+RSEqyvMfujnjN8SBHsqawzXmys7MpKSkJeolSgD33BCKTJKMoihLvhKw3XXHGqjMVpfmoBzmRcBueTTWQPY3iKMYgg+/an1lZWbZLZHfrBjNnRkpCRVGUuCdkvalxxooSNtRATiSaayDHKAYZ8Hnbb/r06fbxcg88AB3tSyApiqK0BkLWmxpnrChhQ0MsEolEMZBtYpDB/22/vLw8SktLyc7OJj8/X28PKoqi4F9vXnv9jaxZtUL1pqJEADWQE4lEMZBDjHXWeDlFUZTQCNRsRFGU5qEhFglCUVEROeXlJAE5GzdaZdBCNZA9ac6xoawdyfMoiqL4oaioiJycnEa1ghVFUQKh1ksCUFRURG5uLiUiVq1gEXKBojfeCG0hd6e6SBOtahmKoig+qNObJSWNagUriqIEQg3kBCAvL69xzUsg7+67Q1qn6NtvrY51EFlvio8YZEVRlGhhqzddtYJDQb3QitI60RjkBMBd27LR+MqVQa9RVFRE7qxZuL8u3N4UIPzxv+pBVhQlxvjUmz7G7XB7od2GdkT1pqIocYW69xIAX7UtQ6l5mZeXR1lVVYOxpnhTgiIpiSKwvNVvvqleF0VRok7Y9GYYvNDBoJ5qRYkv1EBOAHwViw+l5mU4vCnBUrRwIblACVgx0xr7pyhKlEkkvanx0ooSf6iBnAD4KhYfyi2+cHhTgiXvk08o8xqLmLdaURTFhkTSm9H0VCuKEhwxMZCNMacZY341xtQaY0b7mVdsjPnZGLPAGDM3mjLGG06nk+LiYmpraykuLg45/i0c3pRgKd22zX48At5qRVEUXySK3ozmHT5FUYIjVh7kX4CTgc+CmHu4iAwXEZ+GtBKYcHhTgiWa3mpFUZRIES29qTpTUeKPmBjIIvKbiCyOxblbM831pgRLNL3ViqIokSQaelN1pqLEH/EegyzAe8aYH4wxuf4mGmNyjTFzjTFz169fHyXxFDui6a1WFKVpqM6MH1RnKkr8EbE6yMaYD4DdbXbliUiwLeAOEZGVxpjdgPeNMYtExDYsQ0QKgAKA0aNHR6llnOILp9Opyl1R4hjVmfGF6kxFiS8iZiCLyFFhWGOl6+86Y8zrwH4EF7esKIqiKIqiKE0ibkMsjDFtjTHt3Y+BY7CS+xRFURRFURQlYsSqzNtJxpgVwIHA28aYd13jPY0xc1zTugNfGGN+BL4D3haR/8VCXkVRFEVRFKX1ELEQC3+IyOvA6zbjq4DxrsfLgGFRFk1RFEVRFEVp5cRtiIWiKIqSGOzWIT2u14v2+tGSIR6uwx+xlC+eXptIyhIv1xkLOSJ9TjWQFUVRlGbRvUNGXK8X7fWjJUM8XIc/YilfPL02kZQlXq4zFnJE+pxqICuKoiiKoiiKB2ogK4qiKIqiKIoHaiAriqIoiqIoigdqICuKoiiKoiiKB2ogK4qiKIqiKIoHaiAriqIoiqIoigdqICuKoiiKoiiKB2ogK4qiKIqiKIoHRkRiLUPYMcasB0qacGhXYEOYxYk2iX4NKn/sSfRrSHT5oenX4BCRbqEe1AydCYn/eie6/JD415Do8kPiX0Nrlt9Wb7ZIA7mpGGPmisjoWMvRHBL9GlT+2JPo15Do8kNiXUMiyWpHossPiX8NiS4/JP41qPyN0RALRVEURVEURfFADWRFURRFURRF8UAN5IYUxFqAMJDo16Dyx55Ev4ZElx8S6xoSSVY7El1+SPxrSHT5IfGvQeX3QmOQFUVRFEVRFMUD9SAriqIoiqIoigdqICuKoiiKoiiKB2oge2GM+T9jzE/GmAXGmPeMMT1jLVMoGGPuMcYscl3D68aYTrGWKVSMMacZY341xtQaYxKm7Iwx5lhjzGJjzFJjzA2xlidUjDHPGGPWGWN+ibUsTcEY08cY87ExZqHr/+eKWMsUCsaYDGPMd8aYH13y3xprmYJF9WZsSVSdCYmtN1Vnxp5I6k2NQfbCGNNBRLa5Hl8ODBKRi2MsVtAYY44BPhKRamPMXQAicn2MxQoJY8zeQC3wJHCNiMyNsUgBMcYkA78DRwMrgO+BM0VkYUwFCwFjzKHADuB5ERkSa3lCxRjTA+ghIvOMMe2BH4ATE+U9MMYYoK2I7DDGpAJfAFeIyDcxFi0gqjdjSyLqTEh8vak6M/ZEUm+qB9kLt5J30RZIqF8QIvKeiFS7nn4D9I6lPE1BRH4TkcWxliNE9gOWisgyEakEZgEnxFimkBCRz4BNsZajqYjIahGZ53q8HfgN6BVbqYJHLHa4nqa6toTQP6o3Y0uC6kxIcL2pOjP2RFJvqoFsgzEm3xizHHACN8danmYwCXgn1kK0EnoByz2eryDBFE1LwhiTA4wAvo2xKCFhjEk2xiwA1gHvi0jCyK96U2kCqjfjhETVmRA5vdkqDWRjzAfGmF9sthMARCRPRPoARcBlsZW2MYHkd83JA6qxriHuCOYaFKUpGGPaAa8Bf/fybMY9IlIjIsOxPJj7GWPi5rat6s3YojpTiRSJrDMhcnozJRyLJBoiclSQU4uAOcAtERQnZALJb4w5H5gAHClxGmQewnuQKKwE+ng87+0aU6KIKwbtNaBIRP4Ta3maiohsMcZ8DBwLxEUCkOrN2NICdSao3ow5LUVnQvj1Zqv0IPvDGNPf4+kJwKJYydIUjDHHAtcBE0WkLNbytCK+B/obY/oaY9KAM4A3YyxTq8KVrPE08JuI3B9reULFGNPNXT3BGNMGK3EpIfSP6k2liajejCGJrjMhsnpTq1h4YYx5DRiIlRFcAlwsIgnzi9YYsxRIBza6hr5JpGxyAGPMScDDQDdgC7BARMbFVKggMMaMBx4EkoFnRCQ/thKFhjHmJeAwoCuwFrhFRJ6OqVAhYIw5BPgc+Bnr8wvwDxGZEzupgscYMxR4Duv/Jwn4t4jcFlupgkP1ZmxJVJ0Jia03VWfGnkjqTTWQFUVRFEVRFMUDDbFQFEVRFEVRFA/UQFYURVEURVEUD9RAVhRFURRFURQP1EBWFEVRFEVRFA/UQFYURVEURVEUD9RAVlocxpgdgWeFvGaOMeYsP/vvMcb8aoy5pwlrD3eVOlIURYk6qjMVpTFqICtKcOQAPpU9kAsMFZFrm7D2cCAkZW8s9POrKEq8koPqTCWB0X8WpcVijDnMGPOJMeZVY8wiY0yRq3MQxphiY8zdxpifjTHfGWP2dI3PNMac6rGG27NyJzDGGLPAGHOl13neBNoBPxhjTnd19nnNGPO9azvYNW8/Y8zXxpj5xpivjDEDXd2jbgNOd619ujFmmjHmGo/1f3F5Y3KMMYuNMc9jtdHsY4y51nWOn4wxt0bu1VQUpaWjOlNR6lEDWWnpjAD+DgwC+gEHe+zbKiL7AI9gdXLyxw3A5yIyXEQe8NwhIhOBcte+l4HpwAMisi9wCjDDNXURMEZERgA3A/8SkUrX45c9jvdHf+AxERmM1bmsP7AflkdllDHm0ADHK4qi+EN1pqIAKbEWQFEizHcisgLAGLMA67bfF659L3n8faDRkU3nKGCQy/EC0MEY0w7oCDxnjOkPCJDahLVLROQb1+NjXNt81/N2WMr/s6YKrihKq0d1pqKgBrLS8tnl8biGhv/zYvO4GtedFVe8WloTzpkEHCAiFZ6DxphHgI9F5CRjTA7wiY/j62RwkeHxeKfnksAdIvJkE2RUFEWxQ3WmoqAhFkrr5nSPv1+7HhcDo1yPJ1LvsdgOtA9y3feAv7mfGGOGux52BFa6Hp/vMd977WJgpOvYkUBfH+d5F5jk8rRgjOlljNktSBkVRVFCRXWm0mpQA1lpzXQ2xvwEXAG4k0ieAsYaY34EDqTe+/ATUGOM+dE74cSGy4HRriSQhcDFrvG7gTuMMfNp6JX5GOv24gJjzOnAa0AXY8yvwGXA73YnEZH3gBeBr40xPwOvEvwXkqIoSqiozlRaDUZEAs9SlBaGMaYYGC0iG2Iti6IoSryjOlNpbagHWVEURVEURVE8UA+yoiiKoiiKonigHmRFURRFURRF8UANZEVRFEVRFEXxQA1kRVEURVEURfFADWRFURRFURRF8UANZEVRFEVRFEXx4P8BXw4Yn5sNAy8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 720x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#准备数据\n",
    "enc = KBinsDiscretizer(n_bins=10,encode=\"onehot\")\n",
    "X_binned = enc.fit_transform(X)\n",
    "line_binned = enc.transform(line)\n",
    "\n",
    "#将两张图像绘制在一起，布置画布\n",
    "fig, (ax1, ax2) = plt.subplots(ncols=2\n",
    ", sharey=True #让两张图共享y轴上的刻度\n",
    ", figsize=(10, 4))\n",
    "\n",
    "#在图1中布置在原始数据上建模的结果\n",
    "ax1.plot(line, LinearR.predict(line), linewidth=2, color='green',\n",
    "label=\"linear regression\")\n",
    "ax1.plot(line, TreeR.predict(line), linewidth=2, color='red',\n",
    "label=\"decision tree\")\n",
    "ax1.plot(X[:, 0], y, 'o', c='k')\n",
    "ax1.legend(loc=\"best\")\n",
    "ax1.set_ylabel(\"Regression output\")\n",
    "ax1.set_xlabel(\"Input feature\")\n",
    "ax1.set_title(\"Result before discretization\")\n",
    "\n",
    "#使用分箱数据进行建模\n",
    "LinearR_ = LinearRegression().fit(X_binned, y)\n",
    "TreeR_ = DecisionTreeRegressor(random_state=0).fit(X_binned, y)\n",
    "\n",
    "#进行预测，在图2中布置在分箱数据上进行预测的结果\n",
    "ax2.plot(line #横坐标\n",
    ", LinearR_.predict(line_binned) #分箱后的特征矩阵的结果\n",
    ", linewidth=2\n",
    ", color='green'\n",
    ", linestyle='-'\n",
    ", label='linear regression')\n",
    "ax2.plot(line, TreeR_.predict(line_binned), linewidth=2, color='red',\n",
    "linestyle=':', label='decision tree')\n",
    "\n",
    "#绘制和箱宽一致的竖线\n",
    "ax2.vlines(enc.bin_edges_[0] #x轴\n",
    ", *plt.gca().get_ylim() #y轴的上限和下限\n",
    ", linewidth=1\n",
    ", alpha=.2)\n",
    "\n",
    "#将原始数据分布放置在图像上\n",
    "ax2.plot(X[:, 0], y, 'o', c='k')\n",
    "\n",
    "#其他绘图设定\n",
    "ax2.legend(loc=\"best\")\n",
    "ax2.set_xlabel(\"Input feature\")\n",
    "ax2.set_title(\"Result after discretization\")\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 箱子数如何影响模型的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:10:46.022796Z",
     "start_time": "2021-01-21T09:10:45.864220Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8649069759304868\n"
     ]
    },
    {
     "data": {
      "image/png": "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/PnzWbduHV988QWqytixY/nkk08oKiqia9euvPvuuwDs2bOH4uJi5s6dy+rVqxERdu/eXU+2a6+9lkceeYQzzzyTadOmcc899/Dwww8DvhH7F198wbx587jnnnt4//33w7rORuOocrRNnTqVwsJCMjMzyc3NNQecB4iWCeIF4FF8a48F4lNVHROl/jzJOeecQ7t2vnUV+/TpQ0FBAbt372blypWccYZvvcbDhw8zfPhwAD766CPuv/9+SkpK2LVrF3379q1WwFdeGXh5sbFjx9KyZUsA3n//fVauXFm9b+/evezfv58FCxYwd+5cAEaPHk2HDh2q62RlZTFs2DDANzqfP38+gwYNAmD//v2sW7eOkSNH8stf/pI77riDMWPGMHLkSMrLy2nRogU//elPGTNmDGPG1L6de/bsYffu3Zx55pkATJgwgcsvv7x6/6WXXgrA4MGDyc/Pb8ylNSIkJyfHFK4HiYoCVtVPRCQ7Gm01qt8wR6qxonnz5tWfU1JSKC8vR1U577zzePnll2vVLS0t5eabbyYvL48ePXowffr0WnGwrVq1CthPzX2VlZUsWrSIFi1ahCxnzeNVld/85jf87Gc/q1dv8eLFzJs3j//93//lnHPOYdq0aXzxxRd88MEHvP766zz66KN8+GGw9SxrU3V9qq6NYTR14mkDHi4iy0TkHyLSN1AlEZkoInkikldUVBRH8WLDsGHD+Oyzz1i/fj3gs62uXbu2Wtl27NiR/fv3h+3MO//883nkkUeqvy9duhSAM844g9deew3wjXKrbLF1ueCCC3juueeq7dJbtmxhx44dbN26lfT0dH784x8zZcoUFi9ezP79+9mzZw8XXXQRM2bMYNmyZbXaateuHR06dKi277700kvVo2HDMOoTryiIxUCWqu4XkYuAN/Et910PVX0KeApgyJAh3hrihkGnTp144YUXuPrqqzl06BAA9913H7179+bGG2+kX79+dO7cmaFDh4bV/p/+9Cf+53/+h/79+1NeXs6oUaN44oknuPvuu7n66qt56aWXGD58OJ07d6ZNmzbViraK888/n1WrVlWbRVq3bs3s2bNZv349U6ZMoVmzZqSmpvL444+zb98+xo0bR2lpKarKQw89VE+eWbNmcdNNN1FSUsJxxx3H888/H9Z5GU2TOXPmNC1bdVUoUqQbkA18HWLdfKBjQ/UGDx6sdVm5cmW9MqM+paWlWlZWpqqqCxcu1AEDBrgrUAjYvW3azJ49W9PT0xWo3tLT03X27NluixYxQJ760XFxGQGLSGdgu6qqiJyGz/RRHI++myqFhYVcccUVVFZWkpaWxtNPP+22SIYRlGAz9pJ1FBytMLSXgbOAjiKyGbgbSAVQ1SeAy4BJIlIOHASucn4VjBjRq1cvlixZ4rYYhhEyTXHGXrSiIK5uYP+j+MLUDMMw/NIUZ+zZTDjDaIJ4MT1lU5yxZwrYMJoYVekpCwoKUNXq9JRuK+GcnByeeuopsrKyEBGysrJ46qmnktb+CyBeNsUOGTJE607HXbVqFSeffLJLEhmxxO5tfMjOzvb7qp+VlWUzFGOEiHylqkPqltsIOEJqJqJpLKeffnrQ/RdddJHffAuN5c0336w1Xdlo2jRFZ5dXMQXsIgsXLgy6f968ebRv3z7ifoIpYJsS3PQI5NRKZmeXVzEFHAa5ubn07t2bESNGsGbNmuryDRs2MHr0aAYPHszIkSNZvXo1ANu3b2f8+PEMGDCAAQMGVCveqsTu27ZtY9SoUQwcOJB+/fpVT+XNzs5m586dADz00EP069ePfv36VWcXy8/P5+STT+bGG2+kb9++nH/++Rw8eLCWrAsXLuStt95iypQpDBw4kA0bNtRLd/nVV19x5plnMnjwYC644AK2bdsW9HyMxKYpOrs8i7/ZGV7ZQpoJB76tJmPG+MreeutI2ZNP+spuvPFI2ZYtvrIuXfzOXvFHXl6e9uvXTw8cOKB79uzR448/Xh944AFVVT377LN17dq1qqq6aNEi/f73v6+qqldccYXOmDFDVVXLy8t19+7dqqraqlUrVVV98MEH9b777qvev3fvXlVVzcrK0qKiouo+9+/fr/v27dM+ffro4sWL9b///a+mpKTokiVLVFX18ssv15deeqmezBMmTNC//vWv1d/PPPNMnTRpkqqqHj58WIcPH647duxQVdVXXnlFr7/++qDnEytsJlz8mD17tmZlZamIaFZWVlLMNvMyuDkTLpn49NNPGT9+fPUIYuzYsYAvjePChQtrpV+syv3w4YcfVi/Zk5KSUp2ysoqhQ4fyk5/8hLKyMn7wgx8wcODAWvsXLFjA+PHjq7OYXXrppXz66aeMHTuWnj17VtdvTJrHqnSXa9as4euvv+a8884DoKKigi5dugQ9HyPxsfSU3iDxFbC/KI63365fNnGib6tJ167+jw+DyspK2rdvX52NrDGMGjWKTz75hHfffZfrrruO22+/nWuvvTakY+umwKxrgghElTJXVfr27cvnn39ea//evXvDPh/DMELDbMCNZNSoUbz55pscPHiQffv28baj7Nu2bUvPnj3561//CvgUW1W6xnPOOYfHH38c8I0w9+zZU6vNgoICjj32WG688UZuuOEGFi9eXGv/yJEjefPNNykpKeHAgQPMnTuXkSNHhixzmzZt2Ldvn999J554IkVFRdUKuKysjG+++Sbo+Rjh48UJEIZ7mAJuJKeeeipXXnklAwYM4MILL6yVRnLOnDk8++yzDBgwgL59+/L3v/8dgJkzZ/LRRx9xyimnMHjw4HoRCR9//DEDBgxg0KBBvPrqq0yePLlen9dddx2nnXYa3/ve97jhhhuqV7AIhauuuooHHniAQYMGsWHDhlr70tLSeP3117njjjsYMGAAAwcOrHYSBjofIzy8OgHCcA+biGF4hmS/tzYBouliEzEMw2Wa8gQIM734xxSwYcSJpjoBwkwvgUlIBexls4kRHk3hnjbVCRDBEq03dRJOAbdo0YLi4uIm8cA2FVSV4uLiRq3snIg0xWxf0LRNLw2RcE64srIyNm/eXGsJdyPxadGiBd27dyc1NdVtUYwoY87HwE64hJuIkZqaSs+ePd0WwzCMEMnNzWXixIm1zBBNwfQSCglngjAMI3LiGZXQVE0voZBwJgjDMCKjKiqh7ojUlGLssDhgwzAAi0rwEqaADaOJEY+ohGibOJJ1IocpYMNIYvwprlhNCKnqS0S45pprojbxIqkncvhLEuyVzV9CdsMwQmP27Nmanp6uQPWWnp6ukyZNqlcuItVJ+qPVV90tKysrrLazsrKi2p4bECAhe1RGwCLynIjsEJGvA+wXEfmTiKwXkeUicmo0+jUMIzCBbL3z5s1jwoQJiEh1uaoya9assEeV/vqqS7gmjmSeyBEtE8QLwOgg+y8EejnbRODxKPVrGEYAgimuefPm1ZtNGokjLhRlGK6JI5lzaERFAavqJ8CuIFXGAS86o/FFQHsR6RKNvg3D8E8wxRXtUWVDyjCSiRfJnEMjXk64bsCmGt83O2X1EJGJIpInInlFRUVxEc4wkpFgiivao0p/fVUR6cSLpJ7I4c8wHM4GZANfB9j3DjCixvcPgCENtWlOOMOIjECrHwdy0EWyOvKkSZNURKLaZrJAACdcvBTwk8DVNb6vAbo01KYpYMOIHdFemj4ZohViRSAFHC8TxFvAtU40xDBgj6pui1PfhmH4IScnh/z8fCorK8nPz6/3St/YyQ/JHK0QK6KSDU1EXgbOAjqKyGbgbiAVQFWfAOYBFwHrgRLg+mj0axhGbKibL6Jq8gMQ0PaamZnpN+1kMkQrxAx/w2KvbGaCMAx3CMecEAu7cihE25QSC4i1DTgWmylgw3CHus60qk1Egh4Xb2XoltJvLIEUsOWCMAyjHg2FqQWyDzdkV442iZ7ZzRSwYbhMNDJ9RTtbWLAYYi8lx0l4x5+/YbFXNjNBGMlONF6hY/UaHsic4KVwMy/JEgzMBmwY3iMaCiReSqhKIfvrixDsw7HAbMAeZfvexFg1OVHkDESiyx8LGnNNovEKHa8E61Vmh0C4EW4W62nKsf7/TloFvGPvIbdFCIlEkTMQiS5/LGjMNYlGToZgbUTLNjx58uSg6SbdTI4TS8dfrP+/k1YBG0YiEI1MX4HauOiii6LiLJszZw7FxcUB9ydVcpx4488u4ZUtEhvw8k27wz42niSKnIFIdPljQWOvSTRiZ/21ES3bcDC7r9ecXdEmWv/fBLABR2UqsmEYvsHMDW/dwILC/9AiNYUnZm7k6H3l3PTznuxqmwrAjfO2c97iPTxz4THMH9wegEHrDvBe+XaWjDya31/djvv33c/9T9zPq7lrEYUr7+qFNvOtXvHr17YwZO0BHri8K1+e2BqAc5bs4WfvbueOgW154s5TAHhy2+8oDGCvLSwo4If/15v13VoCcNmnxVzx72LeGHE0r57VEYCe20r547OF5HduTkHBnoDn3JiR+pw5c5g6dSqFhYVkZmaSm5vb5EfNpoANI0psP7Cd55Y+V/29xxbovg/WfbuKLQd9ZSnbIG8LPDGnkP3PFEI7oA+cuAU2tCxl+fYjr/q9N/tshMu3r0AdY2Hrrb66Rd9uZHl7X9nQbb6yT48pZfn2HQAcsx8yAX8qOBPY9O06ljtP/zinzfJtW1m+fSsAzbb7ykoqSn0y+tHBGRkZISvQcHJLNAXENzr2JkOGDNG8vLywjl2xeQ+ndG8XZYmiT6LIGYhElz+abPvvClac25+9bdLo9c8vaL5mA1JezqFex6FpvhHwe8++zN2/nUHpocPVx7Vo0Zzf/uJGLh43msNZ3Y+Uf7MGgNI+vcFZvy2tcAvN9u3ncI+uVLZtA0DKrt2kbttORft2lHXr7Du4rIx/PT6L/3voqdp9NW/Ob2+/kfNvyEHTfSPgo3bs5KiiYso7ZVB+jG8ELAdLab6xAG3enLnLVzLttmmUl5VXt5Oamsrzzz8fsvLMzs72G0GRlZVFfn5+SG24QbT+v0XkK1UdUm+HP7uEVzazAXufRJc/VEKx025d+YUq6Na2zQK2E++JA9GyL6elpdWSNy0trVFthZtbwm1ibQN2XckG20wBe59Elz8UQg32L/x2rZ7/Y/QHP8sI2FYiKqJEmiwSbcwJZxguEyzhS81XcG3RnPknwLGtWgRsKxFz5gaa0FFQWMClr15KRvFBfvrCMnYd3ZJnrh9Qvf/G55bS4btSnr5+AJ0u6cTmpzZTcbiien9KWgqdLunEbQ+cw1V/XUVhj7a8ckWf6v23/elL0soqePjWoRxOSwFg7DvrOGlNMW9dfAKrT/KZS/qs2smYeetZeVJH3rn4BADSDpVz26N5HE5L4eFbh1a3efWrK+mxeS8vX9GHTT3aAjA0byvf/3chXw7uwkdnZQFUn9O3bZtz942Dqo8fmTmSXwz/RUTXsyamgA2jAUKdaaaOP0WQgG3l5ubWckaB91f4DfSjQVuYu3ouJxbB01/C6gyYO3xj9e4/5kGvXXDNsG2s7wiMgQ7vwO7D0LoF7LuogryOebT+Bh7+Eg4WbWNu/zWwHPgA3tzjcxhue/0tDp/qa/OKJTDsG3g4cxtznX5aroBhX8KG0m3MPX4FAG1K4ZUvYW8azF29uVqmyYthWAHc0XcbnxzwlR23zHf8gqO2MbfzYoDa57Q6v/r4lqkto3NRHUwBG0YDhDxq3buXW/4DzdoeCNhW1Yg5kcKx/P1oNG+eyk1Tb2bUmFEcdeAgi3ovozy9BW+cMbC6zvauSyg+eIgHTx9ARauWcAW0vSaf1oXfsqdXJgeyuwKQtmsPi05dRbMObZj8bTFPzHuCQ6WHUHxRHM3npzF5xCRGjRlFh5PWsWh7MRP6ncAVXXwj4JYjilh05ga6du7IG6f4RsBSVs6iLnloSgpvnH1kBMxx37Dou31MGXwyk4/2Oddan7aVRWMKGZjVhTd6+0bAVee0pRzeuHBY9eE92vaI7sX1Z5fwymY2YO+T6PKHQsg24CX/VgUt7JDikqSxI16J1r1mK461DdimIhtGA4Sa8KWiTSseHQqvD27lkqSxoyrfwrLC72KaaD3SxELRzosca0wBG0YIhJLwpaJDe269GP7fhR1ckDC2VCm2AZkdYqrYIklO5KVE8aFiCtgwooTSsBMuEYmnYoskOVEiLk9kCtgwooQePkzWd9B5T0XDlROIeCq2SPL7JuLyRKaADSNKHFWwifyZ8Npj29wWJarEW7E1ZO4JZOeNRm7leGMK2DCihKakUNAOdrSNXXSnG04mLym2YOaQYHmRPeuY8xca0dgNGA2sAdYDd/rZfx1QBCx1thtCadfC0LxPossfTVYVrVKmo1kzTohJ+26tf+alddcaClOrGy43adKkiGT3fC4IIAXYABwHpAHLgD516lwHPNrYtk0Be59Elz+arNyxUpmOZs/oFZP23YyRjVcccEM0NpdGpNcsEeKATwPWq+pGVT0MvAKMi0K7huEpGnr99xcFEU2TgZtOpnjFATdEY80h4V6zeIXdRWMEfBnwTI3v11BntItvBLwN3yzv14EeQdqbCOQBeZmZmWH/4iTKyCxR5AxEossfKqG8hq9dNE+XH4PO79c65GMC9eVvtOmFWWJu3+/GXtNwrlksTC7E0AQRigLOAJo7n38GfBhK22aC8D6JLn+ohPIgr/34b6qgazunhXxMXYI9/F6wxXrhfjfGHBLONYvFD10sFfBw4L0a338D/CZI/RRgTyhtmwL2Pokuf6iEYntckf+l9puEnnPXcSEfU5fGOpnibYtNxPsdyjWrWcff9W/ovjVELBXwUcBGoCdHnHB969TpUuPzeGBRKG2bAvY+iS5/qIQyKlr27TJlOnrCzD4hH1MXrydsT/T77U8Z+xslx2sEHLETTlXLgVuA94BVwGuq+o2I3CsiY51qPxeRb0RkGfBzfDZhw0gYQpki63vOqHbBhTOt1ksxt8lGoBjiyZMn15vpV5eY5Wz2p5W9stkI2PskuvyNoaFX2RVL3tPfjUDv/WHnkI/x14fbdt5gJPL9DvRGEmyLlqkHWxPOmySKnIFIdPmjyar3/qIKurJbi4jacdvOG4xEvt/B7Lv+tqysLFsTzjAShcPHZnDX2ZByTAa/jaCdnJwcT6+QkagEWtkkIyODgwcPurJMlOWCMIwoUdYpg9+PgtfPyHBbFMMPgWzyM2fODDsDW6TYCNgwooQmaT7gZCEnJ4fPPvuMp556ioqKClJSUpgwYUK1onXjrcNGwIYRJWT/AYYXQu+tpfX2JdpSOcnInDlzmDVrFhUVvnzNFRUVzJo1y9V7YQrYMKJEi7UbWfgc3DdnU63yRFwqJxnx4ooZpoANI0pUpLfk8+6wrmvLWuVefPCbIl5cMcMUsGFEiZLe2Zx+A0y7JrtWuRcf/KaIFye5mAI2jCih6t8J58UHvykSyYKfscIUsGFEiUBREF588JsikSz4GSssDM0wokSrJd+w84+wqudauPlIedUDPnXqVAoLC8nMzCQ3N9cmW7iA1ya5mAI2jGhRVkbGQWhzsP6y9F578A1vYArYMKLEvgEn03EK9Ol8Ep+4LYyREJgN2DCiRGVqCsWtYH96qtuiGAmCKeAwsZlNRl2OREEYRmiYCSIMqmY2VQXXV81sAnfmkxveoOWGAp6fC/t6boGb3JbGSARsBBwGNrPJ8EfqjmKuWwZnfLPbbVGMBMEUcBjYzKbkJlTzUt16c9flc/04ePGC7nGW2EhUzAQRBoESO9vMpsQnVPOSv3r3/+FJDl0IQ0+xfMBGaNgIOAxsZlPyEqp5yV+9QwcPwQeWD9gIHVPAYeDFKY1GdAjVvBTQ3LQHBq7fE22xjCQl6RVwXTvdzTffHJXwsZycHPLz86msrCQ/P9+Ub5IQauKcQPWygBverm+eMgx/JLUC9pcI+/HHH7fE2EZAcnNzSUtLq1WWlpZWz7zkzwzVvHka47rCsl7t67VrceOGP5JaAfuz09Wlpn3PHhIDjkyoCPQd/JuhJv/uNv40EZ4fe1yturYihhEQf2vVN3YDRgNrgPXAnX72Nwdedfb/B8gOpd3BgwdrY5k9e7ZmZWWpiCgQ0iYiOnv2bE1PT69Vnp6errNnz260DI1h+abdMW0/1iS6/HXJysry+z+SlZXV4LH/WPcPZTp6+tPnRK1Nr5Fs97shonW+QJ760XERj4BFJAX4M3Ah0Ae4WkT61Kn2U+A7VT0BmAH8MdJ+/VF3pBEqmZmZNrnCACKL8dbyctLKIaWiMmptGrHHzTffaJggTgPWq+pGVT0MvAKMq1NnHDDL+fw6cI6IRD1WJxSTQ12qwsfsIUkuwn2oIlm9ouMneRy6D/746PKotWnEFrfNQ9FQwN2AmsvAbnbK/NZR1XJgD+A3Wl1EJopInojkFRUVNUqQYMqyyk43adIkv+Fj9pAkD5E8VJHEeKsIh5tBRYqtiJEouP7m688u0ZgNuAx4psb3a4BH69T5Guhe4/sGoGNDbTfWBhyJrc1swOHhRfkjtbnW9CNkZWWF/D/w9pq3lenoyGfOj1qbXsOL9zsSAvmKRERVE8AGDGwBetT43t0p81tHRI4C2gHFUei7FpGMNGxyRfIQqTkp3BhvrUpH6ce6ZnHj3sTtN99oKOAvgV4i0lNE0oCrgLfq1HkLmOB8vgz4UKv+W6NIpErUHpLkwK2HqmpRTiNxcNs8FLECVp9N9xbgPWAV8JqqfiMi94rIWKfas0CGiKwHbgfujLTfQFQp0WWF35kSbaK49VC1X7yK916E6/++vt4+izH3Jq6/+fqzS3hlCycOuIpEsVUlipyB8Kr8bthcFz1ypyrogoHH1JPFDf9CLPDq/Y4ViWADNgzP4YY5aefA3lzwY3hxXK9a5a572g3PYgrYMKLEoYx2zD8B1me3r1VuMeZGIEwBG0aU0KooiDr5gN32tBvexRSwYRAdJ1l6wVZu+Q8MXbGjVrnbnnbDuzQZBWxeaCMQ0ZqO2n7Vf3nkH3DhJ5tqlbvuaTc8S5NQwG7P9za8TbScZPsyj+XRoZB3yrH19lmMueGPJqGAE9ELbSP2+BEtJ9l3J2Vz68Xw3lnZUZDKaAo0CQWcaF5oG7HHl2g5yapmwtminEaoNAkFnGhe6EQcscebaL4hRMtJlnLgIFnfQbt9h8OWxWhaNAkFHOwB8+KrfqKN2ONNtN8QouUk6/pRHvkzYdLsZWHJYTQ9moQCDvSAAfUe5Ouvv56OHTu6qpATbcQeb2LxhhANJ1l5y+YUtIO9rZuHLYfRtGgSChj8P2D+HuSysjKKi4tdtb1a3Gh9ar6pFBT4X/Y9lDeEWL7xbPr+qWT/Ap6ccGrU2jRii+tvwP4SRHhli3UynlAX7ozl4omB5EyUBN7xSM7iL5lNOPcp1klxXlz6ojIdvfilK6LSnhdJpmQ8ofw/WDKeGBLqK70btleLGz1CKGv9hfKGEGvn5pEoCCMR8IKzu0krYH+v+v4w22ttar62XTDslJi/toWy1l8oTrNQnJuRvJJ2/2gxK/4M17y2IuRjDPfwhLPb37DYK1s88gHXfNXPyMjQtLS0uOZtTbRXOjdy20a6xluo7UR6bp/c81NV0A9GZDfyDBOHRPt/DUYo/1exNkEcFTdN71FycnJqjZzmzJnD1KlTKSwsJDMzk9zc3Cb9+l+XQK9tv5z4E5Z2XALOemhD31vBMYXFfHl+P3ZkdQQgc9VWTlmwlsKTurBi5IkAND9wiHP/8jmHWqbx/o9Pr25zxNyvaLdzHwvGnUrfq/qy5eEtlB8qr95/VPOj6HtVX+6bcxMj3vyKPRltWHDp4Or95875nOYlh/jgR8MpbeWLShg96Ghe2LyJQxWV1fVS01L48bHNeO2Xo7l59ud+z+3m229maaelDZ7T2z1KuHkSnHZyf86O+EobsSY3N5eJEyfWuudxd3b708pe2WxFDO8RcBVZUO5Gme7b3uqNKuiYq4+U3TjGV/bkqUfKOv/SV7a19ZEypqNfdvGVD77RKbsUbdfc10+75r7vTEdPneirl9el9vFbWvvKu9x+pOyJwehs0NYtHbnboQOH++q93asBZ2wjzinnrze5fZtiRqL9vzZEQ85uGwEbniIzM9NvGNgxrVvwy3PvqR4BV6Su4OMtxYwd1Y9R3X2jxU5ZW/k4cy0dju/C/d/zjYBTSw7x8cHPKWuRxv3nHhkB7yj7io+/28dPLhjMlRlt4Fzodm4+Xb/OZ2u/bLb0zwagVfE+Pj7qK0o6tOH+c4+MgL/Zu5C1pYf59ejhlKX7RsBHt11Lp+9t5dGhvdnRqysA7bcU8/GgFVR0zaD9I2+ze/vueufW/tj23HXuXSGdU/OjmjPg6IsjvMpGvKj7Bhx3/Gllr2xujYDjGQKWaCMKf3bS1Bapng2T80eg+xst+3ai3dPGkMzn5o9Yj4BdV7LBNjcUcDgPYSQKO1H+oes6KzMyMlRAOzdDp1w20m3xQqah+xuNH99EuafhkMzn5g9TwGES7oVrrMc90lFTIvxDBzrHqQO7qYL+e0riTDyIVkRFMBLhnoZLMp+bP2wiRpwJFANYUFDAzTffXK/cC8HcsSbQOT6y6TuG3Aj/PWdwgCO9hydiPw3DIamccDM+n0FR7l38+oNDvH1GGqPOawlA7x0VvPfYftYe04wLbm5TXf/Th/fSfbcyanIbNnXw/Ra1T1O+O+S//ccff5xnljxDqx+0AmD1fXso3K9+6xYUFNCsQzNaXNCCH4nw4JsH+duAVH453jfxo11JJUvv38ehrLZUrNhBSmpatC5D1AmknPbuKuGrbnCoY/v4ChQBgZyINtnGcIOIRsAicrSI/EtE1jl/OwSoVyEiS53trUj6DMahikNUlpbSvlRpVnqI3aW72V26m/2l+2hfqrQ6WFFdtrt0N61KK2lfquwr3VtdNqYbBJsbV/afsuq67Q4qwR5b3a0c/NtB1qwroX2pklJ6uPrYvaV7aV+qdPp2D9vWLYn2pYgqgZRTq46+H6JmkjgvUpboyPAU/uwSoW7A/cCdzuc7gT8GqLc/nPYbawM+WHZQd+3aqt9t2agLV6zSXSW7fNu+Iv1uy0bdtS3/SFnJLt21Ld9Xvq/oSNnOzfrUIzOCxoRW1f1uy0Z96pEZ2rJly6D1u3fv7uunaNORfvbv1H73dVOZhm7YtaGxJqW4EsgGfM0lfXTaWejcv0xzW8RGEesol2S2kybzufnD0044YA3QxfncBVgToF5cFHBNIr1wKSkpfpVpSkpKvbpVD3QgBSwifvs4buZxynR0XfG6iGSNB/6U1qffP14V9NN7fuqaDF4kmZVUMp+bP7zuhDtWVbc5n78F6i8H66OFiOSJyCIR+UGwBkVkolM3r6ioKELxwmfixIkhl1dlLsvKyvJ7TKBX+BRJAaCisiJMKeOHv+xsXw3tzj1nwu4T/Z93NLF18oxkpEEFLCLvi8jXfrZxNes5Wt6/RwqyVHUI8CPgYRE5PlB/qvqUqg5R1SGdOnVqzLlElccee4xJkyaRkuJTkikpKUyaNInHHnss4DGNtS8+9vQ2lj8GKf/1n2Dc63zxvW5M/z7sPrlnzPtqCtEmRtOjwSgIVT030D4R2S4iXVR1m4h0AXYEaGOL83ejiHwMDAI2hCdy/HjssceCKty6VE1pDDWZT3ZRGSfsgHUlB6Iib7ypVF9Sm3g44Sx8zEhGIn1y3gImOJ8nAH+vW0FEOohIc+dzR+AMYGWE/XqWxiRSv31iJqdMgoNZ3eIoYfTo+O1eBm2F5nuDJ0uPBrZOnpGMRKqA/wCcJyLrgHOd74jIEBF5xqlzMpAnIsuAj4A/qGrSKuDGUNglna+PhYrmqW6L0iiqkpb/+ZZ57HoKVvz5jZj3aeFjRjISkQJW1WJVPUdVe6nquaq6yynPU9UbnM8LVfUUVR3g/H02GoInA1Wv7hVa3wnn+mKBAajlDAMKgD+88UHM5YvW0vGG4Sn8hUZ4ZUv2fMC/y8nU3BHoki/eqlXuxqoToRKPXAqJTiL874VLMp+bP7wehmZEwCULi7lrAaRs/bZWuZc9/o1xhtUdxd98882eHNUbhlskVS6IROPvZ3bm5Z4b+EHnjrXKvezxDzWXQpWpouqHpKCggMcff7x6f1UcL2BmBKPJYiNgF/nnqC78bhQc7JxRq9zLHn9/zrAWaan1nGGhLCXvlVG9YbiFKWAXqXbC1ZkJ52WPfy1nGJAF3HXNJfVGsaGO1r0wqjcMt2jSCtjtSIPsbaUM2wTN9uytVe51j39VrPOlj51F2e0w7LYJ9eqEOlr3wqjeMNyiySpgL+QW+Pmc9Xz+LLReWj8sujETOkIl2j84e1ofxda2QMuW9fb5G8XXJZqjerd/TA0jLPyFRnhli2UYWrzDqfxl8pp7XqZ+3g1d+NpDMemzbv/RDm07e9bZynT0/Q3vB+yz5jlPmjQpJtnMvBa2l8yhWsl8bv7wdDrKWG+xVMAi0qjUkZHgT0GkpaXpUa2OUkA7de0Uc2URix+cx644Tp8YjH7+/qzoCRoGXotNTmYllczn5g+LA44RsYw0qPs6PHny5HoRAYcPH6b8QDkARVuLYm7+iEVo2+lLd/Kzr6DFzt1htxENvBy2ZxjBaLIKOFaRBv5sy8XFxQ0eF+uQrFj84Pzlgq7cdDEc6tkj7DaigZfD9gwjGE1WAccq0iCU+NdABBqxRcPBFIsfnE8HdODJoVDRJVAefh+xdpB5OWzPMILizy7hlS0Rc0EEsi2HsvmzWQZyMIXj0Ir2kj7fe/p7ynT0802fB+0zHg4yLy1XlMx20mQ+N3+YEy5M3PpHCeQQysjIqFYQGRkZmpqaGpJSCtReXUXvhtd/4q9O0ouvRvO+8R8Foeo9B1k8SGYllczn5g9zwiUYgV6HZ86cWR3Xu3PnTp5//nnSO/rqZXTJCGj+CGSW8N3TI7gxrXfya4W88zK0LNgSsI45yAwjMKaAo0yotuWcnBzGPzkepsOMf8wA8GsnbYwjKd5KbekJrXinF2i7dgHrmIPMMAJjCjgGhDqL7fsfbuT5ubD80dcDzsrzN6IWEb/txVup3X95Vy7JgbLjAq+KHMxBZrPXjKaOpaN0kd6rihi5DDpufI+SkkO19pWUlHDblNt4es69TBk7gsf/9R+Kdu0lo3MGg0YN4pO/fcShsvLq+mkt0rh69GAWPvBzdg46kRInw1qrTdvJ+HoD+7sdw67+JwDQ7HAZ3T/4ksrUo9h87mkseHcBr858leJtOzmmfRuuuvVyhl1xHgBtN2ym/dpC9h7XrXr5+dS9B+jy2TL6r9vCsm7BF+UMtFApUC9dpaWnNJoc/gzDXtkS0QnXGB78wzi9blzwyIgWrdDZoP88HmX6ke0F0Kyqeu1QLkXfOAlV0PFXHKl33Thf2XMDj5RlTPGVFbX0HUdq7T6bpTjl09Gxfer3c8pNvuOXHeOrs7podaPPPZmdc4nwvxcuyXxu/oi1E85GwC5y4U9+xyc90kn/7O+U7PQfO1x6AH7aTLjhmG5c2feM6vLjR3zOXyqVR38+jMoU3wj0wNurWXj0Lk4eeCJpvXwj4J7sYGHReir7HMOVfX0j4JYlZSw8/UsOtkwl/ZNvKSmr3XdlBaR/kk7/7v35x9ovKMO3/Dx7IOWdFDr/6BQWnl7Mzo6tuGnQOHpn9G70uZtzzjCwEbDbLN+022+sbN0tViPDYHHLKSkpDcoS7nW2EXBikszn5g8LQ0tSqhxQAzI7MHXqVCZMmEBWVmBnVqxGhsEcdxUV9VdrjpYsNnvNMCwKolFEy2vvL1/ErFmzyM3NDaiEYxXhEEre3ljI4vWk84YRF/wNi72yeckEEcqU2lCnwwZ7/XYjt22V3P5kqrvVlaWpvZKGQjJfk2Q+N394eioycDnwDVAJDAlSbzSwBlgP3Blq+5Eo4G/3HAz7WH80ZLNsjOJsKBexW3kNAp1jSkpKQFmifZ2TgWS+Jsl8bv6I1vnGSgGfDJwIfBxIAQMpwAbgOCANWAb0CaX9SBRwtGlIaTbGqeRVB5TXVpYwjGQhkAKOyAasqqtUdU0D1U4D1qvqRlU9DLwCjIukXzdoaEptY8KqvOqAMrusYcSXeDjhugGbanzf7JT5RUQmikieiOQVFRXFXLhQaUhpNibngZcVXSwWAzUMwz8NKmAReV9EvvazxWQUq6pPqeoQVR3SqVOnWHQRFg0pzcaOak3RGYbR4Ew4VT03wj62ADXXrOnulCUcOTk5ARVloJwHplgNwwhEPEwQXwK9RKSniKQBVwFvxaHfuBPLUW20M4dZJjLD8AD+PHOhbsB4fDbdQ8B24D2nvCswr0a9i4C1+KIhpobavpeiINwk2tEJFu1gGPGFAFEQ4tvnTYYMGaJ5eXlui+E62dnZFBQU1CvPysoiPz/f9fYMwwiOiHylqkPqlttU5AQg2pnDLBOZYXgDU8AJQLSX9WlMe2YrNozYYQo4AYj2xI1Q2/OXNKhqqaSGMMVtGCHgzzDslc2ccEeIdn6IUNoLd8q0OfkMozaYE85oLM2aNcPf/4eIUFlZGfA4c/IZRm3MCWc0mnBtz+bkM4zQMAVsBMSfrVhEuOiii4IeF22noWEkK6aAjYDk5OQwYcIERKS6TFWZNWsWc+bMCeho82q2N8PwGrYqshGUefPm1bMDl5SUMHnyZA4ePEhJiW9F5aoICbC8GIYRKuaEM4ISyBEXCHO0GUZ9zAlnhEVj7bbmaDOM0DEFbAQlkD03IyPDb31ztBlG6JgCNoISKBH9zJkzzdFmGBFiTjijQYIlojdHm2GEjznhDMMwYow54VzGktMYhlEXM0HEgaqsYsFiZg3DaHrYCDgOTJ06tVr5VlFSUsLUqVNdksgwDC9gCjgORCM5jZkwDCP5MAUcByJNThNJYnTDMLyLKeA4EGlymniaMGykbRhxxF+Wdq9sybQiRiQrWoiI35UpRCTqMtpKFoYRfbAVMRKXeK0wYStZGEZssDjgBCZe+XVtJQvDiC8RKWARuVxEvhGRShGpp91r1MsXkRUislREbEjbSALlY4h2DLGtZGEY8SXSEfDXwKXAJyHU/b6qDvQ3DDcaJicnh/z8fCorK8nPz4/JBA5bycIw4ktEClhVV6nqmmgJY7hLvEbahmH4iIoTTkQ+Bn6lqn7NCyLyX+A7fJ71J1X1qSBtTQQmAmRmZg725xQyDMNIJAI54RrMBSEi7wOd/eyaqqp/D7H/Eaq6RUSOAf4lIqtV1a/ZwlHOT4EvCiLE9g3DMBKOBhWwqp4baSequsX5u0NE5gKnEZrd2DAMI2mJeRiaiLQSkTZVn4Hz8TnvDMMwmjSRhqGNF5HNwHDgXRF5zynvKiLznGrHAgtEZBnwBfCuqv4zkn4NwzCSgYjyAavqXGCun/KtwEXO543AgEj6MQzDSEY8PRVZRIqAcMIgOgI7oyxOPEhUuSFxZU9UuSFxZU9UuSF82bNUtVPdQk8r4HARkbxEnPCRqHJD4sqeqHJD4sqeqHJD9GW3XBCGYRguYQrYMAzDJZJVAQecaedxElVuSFzZE1VuSFzZE1VuiLLsSWkDNgzDSASSdQRsGIbheUwBG4ZhuERSKmAR+a2ILHcSwM8Xka5uyxQqIvKAiKx25J8rIu3dlikUQk3O7yVEZLSIrBGR9SJyp9vyhIqIPCciO0Qkoab0i0gPEflIRFY6/yuT3ZYpVESkhYh8ISLLHNnviUq7yWgDFpG2qrrX+fxzoI+q3uSyWCEhIucDH6pquYj8EUBV73BZrAYRkZOBSuBJgqQm9QoikgKsBc4DNgNfAler6kpXBQsBERkF7AdeVNV+bssTKiLSBeiiqoud/DBfAT9IkGsuQCtV3S8iqcACYLKqLoqk3aQcAVcpX4dW+PIQJwSqOl9Vy52vi4DubsoTKgmYnP80YL2qblTVw8ArwDiXZQoJJ5XrLrflaCyquk1VFzuf9wGrgG7uShUazuLG+52vqc4WsV5JSgUMICK5IrIJyAGmuS1PmPwE+IfbQiQp3YBNNb5vJkGUQTIgItnAIOA/LosSMiKSIiJLgR3Av1Q1YtkTVgGLyPsi8rWfbRyAqk5V1R7AHOAWd6WtTUOyO3WmAuX45PcEochtGA0hIq2BN4Db6rytehpVrVDVgfjeSk8TkYjNPxFlQ3OTRiSKnwPMA+6OoTiNoiHZReQ6YAxwjnrISB+N5PweYgvQo8b37k6ZEUMc++kbwBxV/Zvb8oSDqu4WkY+A0USY2zxhR8DBEJFeNb6OA1a7JUtjEZHRwK+Bsapa4rY8ScyXQC8R6SkiacBVwFsuy5TUOI6sZ4FVqvqQ2/I0BhHpVBWRJCIt8TlvI9YryRoF8QZwIj6vfAFwU9WySF5HRNYDzYFip2hRIkRwiMh44BGgE7AbWKqqF7gqVAOIyEXAw0AK8Jyq5rorUWiIyMvAWfhSI24H7lbVZ10VKgREZATwKbAC37MJcJeqzgt8lDcQkf7ALHz/K82A11T13ojbTUYFbBiGkQgkpQnCMAwjETAFbBiG4RKmgA3DMFzCFLBhGIZLmAI2DMNwCVPAhuuIyP6GazW6zWwR+VGQ/Q84Wa0eCKPtgU4Im2FEhClgI1nJBgIqYGAi0F9Vp4TR9kCgUQpYfNjzZtTC/iEMzyAiZ4nIxyLyupMTeY4zewoRyReR+0VkhZOX9QSn/AURuaxGG1Wj6T8AI52c0L+o089bQGvgKxG50pnl9IaIfOlsZzj1ThORz0VkiYgsFJETnVlz9wJXOm1fKSLTReRXNdr/2hmBZzv5hl/EN2W1h4hMcfpYHq2cskbiYgrY8BqDgNuAPsBxwBk19u1R1VOAR/HNYAvGncCnqjpQVWfU3KGqY4GDzr5XgZnADFUdCvwQeMapuhoYqaqD8GXU+52TunIa8GqN44PRC3hMVfvim53ZC18qzIHAYCe3r9FESdhkPEbS8oWqbgZwUv9l40t+DfByjb8z6h0ZPucCfZzBNkBbJ2NXO2CWk1tE8eWAbSwFNZJ2n+9sS5zvrfEp5E/CFdxIbEwBG17jUI3PFdT+H1U/n8tx3uQcG2taGH02A4apamnNQhF5FPhIVcc7+Ws/DnB8tQwOLWp8PlCzSeD3qvpkGDIaSYiZIIxE4soafz93PucDg53PYzkySt0HtAmx3fnArVVfRGSg87EdR1JUXlejft2284FTnWNPBXoG6Oc94CfO6BoR6SYix4Qoo5GEmAI2EokOIrIcmAxUOdaeBs4UkWXAcI6MOJcDFeJbRPEX9Zuqxc+BIY5jbCVQlX3ufuD3IrKE2iPxj/CZLJaKyJX48tseLSLf4Ev+v9ZfJ6o6H/gL8LmIrABeJ/QfCSMJsWxoRkIgIvnAEFXd6bYshhEtbARsGIbhEjYCNgzDcAkbARuGYbiEKWDDMAyXMAVsGIbhEqaADcMwXMIUsGEYhkv8f42EX3mlxFDTAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 360x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "enc = KBinsDiscretizer(n_bins=5,encode=\"onehot\")\n",
    "X_binned = enc.fit_transform(X)\n",
    "line_binned = enc.transform(line)\n",
    "fig, ax2 = plt.subplots(1,figsize=(5,4))\n",
    "LinearR_ = LinearRegression().fit(X_binned, y)\n",
    "print(LinearR_.score(line_binned,np.sin(line)))\n",
    "TreeR_ = DecisionTreeRegressor(random_state=0).fit(X_binned, y)\n",
    "ax2.plot(line #横坐标\n",
    ", LinearR_.predict(line_binned) #分箱后的特征矩阵的结果\n",
    ", linewidth=2\n",
    ", color='green'\n",
    ", linestyle='-'\n",
    ", label='linear regression')\n",
    "ax2.plot(line, TreeR_.predict(line_binned), linewidth=2, color='red',\n",
    "linestyle=':', label='decision tree')\n",
    "ax2.vlines(enc.bin_edges_[0], *plt.gca().get_ylim(), linewidth=1, alpha=.2)\n",
    "ax2.plot(X[:, 0], y, 'o', c='k')\n",
    "ax2.legend(loc=\"best\")\n",
    "ax2.set_xlabel(\"Input feature\")\n",
    "ax2.set_title(\"Result after discretization\")\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 如何选取最优的箱数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:11:18.302607Z",
     "start_time": "2021-01-21T09:11:18.095162Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#怎样选取最优的箱子?\n",
    "from sklearn.model_selection import cross_val_score as CVS\n",
    "import numpy as np\n",
    "pred,score,var = [], [], []\n",
    "binsrange = [2,5,10,15,20,30]\n",
    "for i in binsrange:\n",
    "    #实例化分箱类\n",
    "    enc = KBinsDiscretizer(n_bins=i,encode=\"onehot\")\n",
    "    #转换数据\n",
    "    X_binned = enc.fit_transform(X)\n",
    "    line_binned = enc.transform(line)\n",
    "    #建立模型\n",
    "    LinearR_ = LinearRegression()\n",
    "    #全数据集上的交叉验证\n",
    "    cvresult = CVS(LinearR_,X_binned,y,cv=5)\n",
    "    score.append(cvresult.mean())\n",
    "    var.append(cvresult.var())\n",
    "    #测试数据集上的打分结果\n",
    "    pred.append(LinearR_.fit(X_binned,y).score(line_binned,np.sin(line)))\n",
    "#绘制图像\n",
    "plt.figure(figsize=(6,5))\n",
    "plt.plot(binsrange,pred,c=\"orange\",label=\"test\")\n",
    "plt.plot(binsrange,score,c=\"k\",label=\"full data\")\n",
    "plt.plot(binsrange,score+np.array(var)*0.5,c=\"red\",linestyle=\"--\",label = \"var\")\n",
    "plt.plot(binsrange,score-np.array(var)*0.5,c=\"red\",linestyle=\"--\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多项式回归PolynomialFeatures"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:14:26.372937Z",
     "start_time": "2021-01-21T09:14:26.365956Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:14:26.793812Z",
     "start_time": "2021-01-21T09:14:26.774863Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1],\n",
       "       [2],\n",
       "       [3]])"
      ]
     },
     "execution_count": 147,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#如果原始数据是一维的\n",
    "X = np.arange(1,4).reshape(-1,1)\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:14:27.423130Z",
     "start_time": "2021-01-21T09:14:27.415151Z"
    }
   },
   "outputs": [],
   "source": [
    "#二次多项式，参数degree控制多项式的次方\n",
    "poly = PolynomialFeatures(degree=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:14:28.092341Z",
     "start_time": "2021-01-21T09:14:28.073392Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 1., 1.],\n",
       "       [1., 2., 4.],\n",
       "       [1., 3., 9.]])"
      ]
     },
     "execution_count": 149,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#接口transform直接调用\n",
    "X_ = poly.fit_transform(X)\n",
    "X_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:14:28.859291Z",
     "start_time": "2021-01-21T09:14:28.849318Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 3)"
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:14:29.419793Z",
     "start_time": "2021-01-21T09:14:29.400844Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  1.,  1.,  1.],\n",
       "       [ 1.,  2.,  4.,  8.],\n",
       "       [ 1.,  3.,  9., 27.]])"
      ]
     },
     "execution_count": 151,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#三次多项式\n",
    "PolynomialFeatures(degree=3).fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:15:58.359089Z",
     "start_time": "2021-01-21T09:15:58.339144Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  1.,  1.],\n",
       "       [ 2.,  4.,  8.],\n",
       "       [ 3.,  9., 27.]])"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#三次多项式，不带与截距项相乘的x0\n",
    "PolynomialFeatures(degree=3,include_bias=False).fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:16:07.859693Z",
     "start_time": "2021-01-21T09:16:07.846728Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 4)"
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#为什么我们会希望不生成与截距相乘的x0呢？\n",
    "#对于多项式回归来说，我们已经为线性回归准备好了x0，但是线性回归并不知道\n",
    "xxx = PolynomialFeatures(degree=3).fit_transform(X)\n",
    "xxx.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:16:12.263921Z",
     "start_time": "2021-01-21T09:16:12.245969Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.49671415, -0.1382643 ,  0.64768854])"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd = np.random.RandomState(42) #设置随机数种子\n",
    "y = rnd.randn(3)\n",
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:16:19.713293Z",
     "start_time": "2021-01-21T09:16:19.703320Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 2.86923263e-15, -3.51045297e-01, -6.06987134e-01,  2.19575463e-01])"
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#生成了多少个系数？\n",
    "LinearRegression().fit(xxx,y).coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:16:22.842928Z",
     "start_time": "2021-01-21T09:16:22.834949Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.2351711202036888"
      ]
     },
     "execution_count": 156,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#查看截距\n",
    "LinearRegression().fit(xxx,y).intercept_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:17:12.515153Z",
     "start_time": "2021-01-21T09:17:12.497201Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1.00596411,  0.06916756, -0.83619415,  0.25777663])"
      ]
     },
     "execution_count": 158,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#发现问题了吗？线性回归并没有把多项式生成的x0当作是截距项\n",
    "#所以我们可以选择：关闭多项式回归中的include_bias\n",
    "#也可以选择：关闭线性回归中的fit_intercept\n",
    "#生成了多少个系数？\n",
    "LinearRegression(fit_intercpet=False).fit(xxx,y).coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:17:37.332815Z",
     "start_time": "2021-01-21T09:17:37.316858Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0"
      ]
     },
     "execution_count": 159,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#查看截距\n",
    "LinearRegression(fit_intercept=False).fit(xxx,y).intercept_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:17:59.095649Z",
     "start_time": "2021-01-21T09:17:59.077697Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1],\n",
       "       [2, 3],\n",
       "       [4, 5]])"
      ]
     },
     "execution_count": 160,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = np.arange(6).reshape(3, 2)\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:17:59.956348Z",
     "start_time": "2021-01-21T09:17:59.951361Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  0.,  1.,  0.,  0.,  1.],\n",
       "       [ 1.,  2.,  3.,  4.,  6.,  9.],\n",
       "       [ 1.,  4.,  5., 16., 20., 25.]])"
      ]
     },
     "execution_count": 161,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#尝试二次多项式\n",
    "PolynomialFeatures(degree=2).fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:18:49.671471Z",
     "start_time": "2021-01-21T09:18:49.652521Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  0.,  1.,  0.,  0.,  1.],\n",
       "       [ 1.,  2.,  3.,  4.,  6.,  9.],\n",
       "       [ 1.,  4.,  5., 16., 20., 25.]])"
      ]
     },
     "execution_count": 162,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PolynomialFeatures(degree=2).fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:18:55.729278Z",
     "start_time": "2021-01-21T09:18:55.724291Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  0.,  1.,  0.],\n",
       "       [ 1.,  2.,  3.,  6.],\n",
       "       [ 1.,  4.,  5., 20.]])"
      ]
     },
     "execution_count": 163,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PolynomialFeatures(degree=2,interaction_only=True).fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:19:21.828804Z",
     "start_time": "2021-01-21T09:19:21.813844Z"
    }
   },
   "outputs": [],
   "source": [
    "#更高维度的原始特征矩阵\n",
    "X = np.arange(9).reshape(3, 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:19:22.317497Z",
     "start_time": "2021-01-21T09:19:22.301540Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  0.,  1.,  2.,  0.,  0.,  0.,  1.,  2.,  4.],\n",
       "       [ 1.,  3.,  4.,  5.,  9., 12., 15., 16., 20., 25.],\n",
       "       [ 1.,  6.,  7.,  8., 36., 42., 48., 49., 56., 64.]])"
      ]
     },
     "execution_count": 165,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PolynomialFeatures(degree=2).fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:19:23.059514Z",
     "start_time": "2021-01-21T09:19:23.039567Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  1.,   0.,   1.,   2.,   0.,   0.,   0.,   1.,   2.,   4.,   0.,\n",
       "          0.,   0.,   0.,   0.,   0.,   1.,   2.,   4.,   8.],\n",
       "       [  1.,   3.,   4.,   5.,   9.,  12.,  15.,  16.,  20.,  25.,  27.,\n",
       "         36.,  45.,  48.,  60.,  75.,  64.,  80., 100., 125.],\n",
       "       [  1.,   6.,   7.,   8.,  36.,  42.,  48.,  49.,  56.,  64., 216.,\n",
       "        252., 288., 294., 336., 384., 343., 392., 448., 512.]])"
      ]
     },
     "execution_count": 166,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PolynomialFeatures(degree=3).fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:19:29.721706Z",
     "start_time": "2021-01-21T09:19:29.704751Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 1771)"
      ]
     },
     "execution_count": 169,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_ = PolynomialFeatures(degree=20).fit_transform(X)\n",
    "X_.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:19:24.587430Z",
     "start_time": "2021-01-21T09:19:24.569478Z"
    }
   },
   "source": [
    "### 多项式回归处理非线性问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:20:30.695722Z",
     "start_time": "2021-01-21T09:20:30.692729Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import PolynomialFeatures as PF\n",
    "from sklearn.linear_model import LinearRegression\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:21:42.128789Z",
     "start_time": "2021-01-21T09:21:42.108842Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LinearRegression()"
      ]
     },
     "execution_count": 172,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd = np.random.RandomState(42) #设置随机数种子\n",
    "X = rnd.uniform(-3, 3, size=100)\n",
    "y = np.sin(X) + rnd.normal(size=len(X)) / 3\n",
    "\n",
    "#将X升维，准备好放入sklearn中\n",
    "X = X.reshape(-1,1)\n",
    "#创建测试数据，均匀分布在训练集X的取值范围内的一千个点\n",
    "line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)\n",
    "#原始特征矩阵的拟合结果\n",
    "LinearR = LinearRegression()\n",
    "LinearR.fit(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:21:43.529046Z",
     "start_time": "2021-01-21T09:21:43.510097Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5361526059318595"
      ]
     },
     "execution_count": 173,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#对训练数据的拟合\n",
    "LinearR.score(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:21:44.494465Z",
     "start_time": "2021-01-21T09:21:44.486487Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6800102369793312"
      ]
     },
     "execution_count": 174,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#对测试数据的拟合\n",
    "LinearR.score(line,np.sin(line))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:21:48.642377Z",
     "start_time": "2021-01-21T09:21:48.636394Z"
    }
   },
   "outputs": [],
   "source": [
    "#多项式拟合，设定高次项\n",
    "d=5\n",
    "#进行高此项转换\n",
    "poly = PF(degree=d)\n",
    "X_ = poly.fit_transform(X)\n",
    "line_ = PF(degree=d).fit_transform(line)\n",
    "#训练数据的拟合\n",
    "LinearR_ = LinearRegression().fit(X_, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:21:49.571893Z",
     "start_time": "2021-01-21T09:21:49.557932Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8561679370344799"
      ]
     },
     "execution_count": 176,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "LinearR_.score(X_,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:21:50.745756Z",
     "start_time": "2021-01-21T09:21:50.736780Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9868904451787972"
      ]
     },
     "execution_count": 177,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#测试数据的拟合\n",
    "LinearR_.score(line_,np.sin(line))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 过程可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:28:19.641277Z",
     "start_time": "2021-01-21T09:28:19.454775Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAB3nklEQVR4nO2dd3hURdfAf7OphECAhB6yoUoJEIoC0lUsqKioKIYSLFhe3lc/Gyp2xd67WAiQKCDFiorSpSO91wAJJRCSkBBS93x/3E1I2U02ZbObML/nuU/uzp07c+7dzT13zpw5R4kIGo1Go9G4GyZXC6DRaDQajS20gtJoNBqNW6IVlEaj0WjcEq2gNBqNRuOWaAWl0Wg0GrdEKyiNRqPRuCVaQWkcQinVXym1x9Vy1ASUUjuUUoNcLUdRlFIvKqWirfshSqk0pZSHq+VyNUqpSKXUP66W42JEKyhNIZRSsUqpq4qWi8gKEbnEFTIVxfogzbY+QJOVUquUUn1cLZejiEgnEVnqajlKQkSOiIi/iOS6WhbNxYtWUBq3RinlaefQLBHxB4KAJcAPTuhbKaVq5P9ICfe1Kvq+6EdlGseokf98mspHKTVIKRVX4HOsUupxpdRWpVSKUmqWUsq3wPEblFKbC4xwuhQ49pRS6oBSKlUptVMpdUuBY5FKqZVKqfeVUonAiyXJJSI5QAzQXCnV0NpGgFLqG6XUcaVUvFLq1byHolLKQyn1rlLqtFLqkFJqglJK8h7YSqmlSqnJSqmVQDrQSinVXin1l1LqjFJqj1JqRAF5h1qvIdXa1+PW8iCl1K/W6z+jlFqRp+wKjlKVUj5KqQ+UUses2wdKKZ+C91wp9ZhSKsF6PeNK+I6aKaV+tva3Xyl1X4FjLyql5iilopVSZ4FIpVRLpdQyq+x/YSj7vPqhNu7LK9bvJlUptVApVbD+D0qpE9bfwnKlVKcCx6KUUp8rpRYopc4BjyqlThZUVEqp4UqpLTauqZe13YJ1b1FKbbXuX6aU2qCUOmtt8z079ybvXj5j/e5jlVIRBY4HKKWmK6VOKaUOK6WeVTZeTpRSnyql3i1S9rNS6v/sfS+aCiAietNb/gbEAlfZKB8ExBWptw5oBjQAdgEPWI91AxKAXoAHMNZa38d6/HbreSbgDuAc0NR6LBLIAf4LeAK1bMjyIhBt3fcG3gBOA57WsvnAl0BtoJFVzvutxx4AdgLBQH3gb0AKnLsUOAJ0svYfABwFxlk/d7P21dFa/zjQ37pfH+hu3X8d+ALwsm79AVX0HgMvA2uscjYEVgGvFLjnOdY6XsBQDKVZ3853txz4DPAFwoFTwBUF7lk2cLP1vtcCVgPvAT7AACC1wH0NtXFfDgDtrOcuBd4o0PfdQB1rWx8AmwsciwJSgL7Wvn2t38F1BerMBx6zc10HgCEFPv8APGXdXw2Mtu77A73ttJF3L/OudyDG7+4S6/HpwE/WawgF9gL3FPhN/mPdvww4Bpisn4Os30ljV//v1sTN5QLozb02yqagRhX4/BbwhXX/87yHbIHje4CBdvrcDNxk3Y8EjpQi44tAFpAM5AKJwCDrscZAJgUUGzASWGLdX4xVWVk/X2XjQfxygeN3ACuK9P8l8IJ1/whwP1C3SJ2XrQ+8NiXdY+vDd2iBY9cAsQXu+fk82axlCbYewkAL672oU6DsdSCqwD1bXuBYiPWBXbtA2XeUrKCeLVD3IeAPO99PPeu5AdbPUcD0InUmAjHW/QYYD/mmdtp7FfjWul8HQ7GYrZ+XAy8BQaX8ZgbZuN7ZwHMYL1FZWF86rMfuB5YW+E3+U+DYLqwKE5gALHD2/+XFumkTn6YinCiwn47xBgtgBh6zmreSlVLJGA/QZgBKqTHqgvkvGQijgHkJY8RSGrNFpB6GQtoO9CjQtxdwvED7X2KMULDKULB9W30VLDMDvYpcSwTQxHr8VoyRzWGruSzPWeNtYD+wUCl1UCn1lJ3raAYcLvD5sLUsj0QxzJh5FLzPRds5IyKpRdpqbue6mgFJInKuSP2SsPl9W82mbyjDbHsWQwFDyd9pNHCjUqo2MALjJeC4nX6/A4ZbTZ/DgY0ikifrPRijut1KqfVKqRtKkN/W9TazyulF8e+h4L0ryDRglHV/FDCjhD41FcBlE6WaGs1RYLKITC56QCllBr4CrgRWi0iuUmozoApUczjEvoicVkqNBzYopb6z9p2J8UadY+OU4xjmvTxa2Gq2yLUsE5EhdvpfD9yklPLCeJueDbSwKorHMBR1GLBYKbVeRBYVaeIYhhLcYf0cYi0rK8eABkqpOgWUVAgQb+e6jgP1lVK1Czy0QyjDvS/AXcBNGKPRWAyzaBIlfKciEq+UWo2hcEZjjLptIiI7lVKHgeusfX1X4Ng+YKR1vmg4MEcpFVhEEeVh63q3Y5hsszG+h50FjsUXbwIwlOt2pVRXoAPwoz3ZNRVDj6A0tvBSSvkW2Mr6IvMV8IB1glsppWorpa5XStXBmBcSjPkRrJP+YRURVkT2AH8CT1rfwhcC7yql6iqlTEqp1kqpgdbqs4GHlVLNlVL1MExNJfEr0E4pNVop5WXdLlVKdVBKeSulIpRSASKSDZwFLNbrukEp1UYppTDmX3LzjhXhe+BZpVRDq9PB8xgPwLLeg6MY81evW7+zLhijC5ttWUcgG4CXrNfRD7ixrP1aqYPxUpAI+AGvOXjedOBJoDMwr5S63wEPY8yV5XtsKqVGKaUaiogFw+QLtu9zHnnX2x+4AfhBDFf62cBkpVQd60vUo9i/d3HAeoyR01wROV+K7JpyohWUxhYLMOY+8rYXy3KyiGwA7gM+wXiT3o9hx0dEdgLvYkxun8R4OK2sBJnfBsYrpRoBYzCcJ3Za+58DNLXW+wpDgW0FNmFcaw6GArF1LanA1cCdGKOUE8CbGBPtYLz9x1pNWw9gmP8A2mI4YKRZr/UzEVlio4tXMRTFVmAbsNFaVh5GYswdHcNwOnhBRP4uof5dGI4sZ4AXMBRGeZiOYRKLx7jnaxw8bz7GqGW+iKSXUvd7DMeGxSJyukD5tcAOpVQa8CFwZwkK4wTG7+EYhufnAyKy23rsvxhzWweBfzAU4rclyDMN47erzXtOJM+rSKO5KFFKXYfh3GF2tSwXI0qpAxhOKyUp0sroZxCGA0hwKVUdbW8AxgjLLPoh6jT0CEpzUaGUqqWMtUueSqnmGCOH+a6W62JEKXUrhrl3satlKQvW+caHga+1cnIuWkFpLjYUhltyEoaJbxfGvI+mClFKLcVwjPiPdf6oWqCU6oAx19UUY72XxoloE59Go9Fo3BI9gtJoNBqNW1Ij10EFBQVJaGioq8XQaDQajQP8+++/p0WkYdHyGqmgQkND2bBhg6vF0Gg0Go0DWBdiF0Ob+DQajUbjlmgFpdFoNBq3RCsojUaj0bglNXIOyhbZ2dnExcWRkZHhalE0lYivry/BwcF4eXm5WhSNRlPJXDQKKi4ujjp16hAaGooRv1NT3REREhMTiYuLo2XLlq4WR6PRVDIXjYkvIyODwMBArZxqEEopAgMD9aj4IiYmJobQ0FBMJhOhoaHExMS4WiRNJXLRjKAArZxqIPo7vXiJiYlh/PjxpKcbgdAPHz7M+PHjAYiIiCjpVE014aIZQWk0mprFpEmT8pVTHunp6UyaNMlFEmkqG62gqoijR48yePBgOnbsSKdOnfjwww9dLZJGU605cuRImco11Q+toKoIT09P3n33XXbu3MmaNWv49NNP2blzZ+knajQam4SEhJSpXFP90AqqimjatCndu3cHoE6dOnTo0IH4+HgXS6XRVF8mT56Mn59foTI/Pz8mT57sIok0lY1LnSSUUt8CNwAJIhJm4/gg4CfgkLVonoi8XNF+Q5/6raJN2CT2jesdqxcby6ZNm+jVq5dT5NBoLgbyHCEmTZrEkSNHCAkJYfLkydpBogbhai++KOATYHoJdVaIyA1VI47zSUtL49Zbb+WDDz6gbt26rhZHo6nWREREaIVUg3GpghKR5Uqp0Kru19GRTmWTnZ3NrbfeSkREBMOHD3eJDBqNRlNdqA5zUH2UUluUUr8rpTrZq6SUGq+U2qCU2nDq1KmqlM8hRIR77rmHDh068Oijj7paHI1Go3F73F1BbQTMItIV+Bj40V5FEZkiIj1FpGfDhsXyXrmclStXMmPGDBYvXkx4eDjh4eEsWLDA1WJpNBo3QEfEsI2r56BKRETOFthfoJT6TCkVJCKnXSlXeejXrx8i4moxNBqNm6EjYtjHrUdQSqkmyhrLRil1GYa8ia6VSqPRaCoPHRHDPq52M/8eGAQEKaXigBcALwAR+QK4DXhQKZUDnAfuFD0M0Wg0NQgdEcM+rvbiG1nK8U8w3NA1Go2mRhISEsLhw4dtll/suLWJT6PRaMpDdXI60BEx7KMVlEajqVHkOR0cPnwYEcl3OnBXJRUREcGUKVMwm80opTCbzUyZMuWid5AAUDVxSqdnz56yYcOGQmW7du2iQ4cOLpJI40z0d6spSGhoqE2TmdlsJjY2tuoF0pSKUupfEelZtNyt3cxrGqGhodSpUwcPDw88PT0pqkQ1Gk3F0U4HNQetoKqYJUuWEBQU5GoxNJoai3Y6qDnoOSiNRlOj0E4HNYeLcwT1YoCT2k0p8bBSiquvvhqlFPfff3/+anGNRlN56DQcNYeLU0G5iH/++YfmzZuTkJDAkCFDaN++PQMGDHC1WBpNjUOn4agZXJwKqpSRjrNo3rw5AI0aNeKWW25h3bp1WkFpNBqNHfQcVBVx7tw5UlNT8/cXLlxIWFixJMIajdtTnRbBaqo3F+cIygWcPHmSW265BYCcnBzuuusurr32WhdLpdGUDR15W1OV6IW6mmqP/m6rDr0IVuMM7C3U1SY+jUbjMHoRrGNoM2jloBWURqNxGHuLXfUi2AtUt1iA7oxWUBqNxmH0ItjS0QkIKw+toDQajcPoyNulo82glYf24tNoNGVCL4ItmYslFqDFIszfFM/hM+k8OqSdU/rQIyiNRqOpRC4GM+j2+BRu/3I1j/2whU8W72N/QqpT+tEKqoo4evQogwcPpmPHjnTq1IkPP/wQgDNnzjBkyBDatm3LkCFDSEpKcrGkGk31xtUedDXZDJqcnsWzP25j2Cf/8O/hJIL8fXj7tq60CvJ3Sn96HVQVcfz4cY4fP0737t1JTU2lR48e/Pjjj0RFRdGgQQOeeuop3njjDZKSknjzzTddJmd1xNXfrca1pGencyL9BF4mL5b+tJQH7n+gkJOCn59fjVEQriLXIszecJS3/thNUno2HibF2D6hPDKkLXV9vSrcvk5Y6GKaNm1K06ZNAahTpw4dOnQgPj6en376iaVLlwIwduxYBg0apBWURlMKIsKSo0v4bvd3bDixgVzJBWDv43vJSs8qVDfPg87VCio1K5Uf9//IqmOrSMpIopFfIwa3GMzQVkPx8fBxqWwlsfloMs//tJ2tcUYM096tGvDSsDAuaVLH6X1flAqq87TOTml329htDtWLjY1l06ZN9OrVi5MnT+YrriZNmnDy5EmnyKbR1BROnz/NMyueYfXx1QB4KA9C6oSQkZvB9tPbbZ7jbA+6mJiYEtN7/Bn7J6+ueZXkzOT8sh2JO1hydAlfbfuK1/q9Rnij8HK37wwS0zJ56489zNpwFIAmdX2ZdH0HbujSFKWUU/vO46JUUK4kLS2NW2+9lQ8++IC6desWOqaUqrIvXqOpjuxN2suDfz3I3kV7OTXvFJmJmbRo0YInXnuCiIgIglsEE380vth5le1BV1BhNGjQgNTUVLKyjJFbwfiEd911F+//+z5Td0wFoHuj7oy4ZATN/ZtzIPkAM3bO4EDKAe7+827eGvAWV5mvstlXVcY/zMm1ELP2CO8u3MPZjBy8PBT39m/FhMFtqO1TxSpDRGrc1qNHDynKzp07i5VVNVlZWXL11VfLu+++m1/Wrl07OXbsmIiIHDt2TNq1a+cq8aot7vDdapzP7sTd0u/7fhI8Plg8fDwEyN/8/PwkOjpaoqOjxc/Pr9AxQEbfM7rS5LDXR9EtJCREJq+ZLGFRYRI+PVxidsaIxWIp1FZWbpa8uvrV/Dr/xP1TrD+z2WyzfbPZXGnXlMc/+07JkPeWinnir2Ke+KuM+nqN7E9IrfR+igJsEBvPcpd68SmlvlVKJSilbI7LlcFHSqn9SqmtSqnuVS1jZSEi3HPPPXTo0IFHH300v3zYsGFMmzYNgGnTpnHTTTe5SkSNxm1JSE/gob8fIjkzmeQfk8nNzC10vOA809ixY4tZImJmxPDZt59Viiy2IkXY4sjRI3y/+3u8Td58OPhD7upwVzG5vExePNPrGUZ1GEWOJYfHlz3O4bOF11BVxcLfw4nnGD99AxFfr2XvyTRCGvjx5egeTL/7Mlo3dI6HniO42sQXBXwCTLdz/DqgrXXrBXxu/VvtWLlyJTNmzKBz586Eh4cD8Nprr/HUU08xYsQIvvnmG8xmM7Nnz3atoBqNm5GRk8H/Fv+PhPMJdG/UnR2ndtisl/fAXrBgAVLEO9mSZeHxpx5n1KhR1PUuYFoXgdTjcOYgJB2GlKNwPgkyzkKWdW2P8gAPL6jVAGo35MiR4otwbeHVwPBum9x/MgOC7ScmVUrx5KVPcjL9JH8d/ov/W/p/fH/99/mOE85c+JuWmcOnS/bzzYpDZOVa8PP2YMIVbbi7b0t8vTwq3H5FcamCEpHlSqnQEqrcBEy3DgHXKKXqKaWaisjxqpGw8ujXr1+xf5o8Fi1aVMXSaDTVh3c2vMOOxB0092/OB4M/YFnIshIf2PZGFudPneeJpY/xaeuReB5ZA8c2QfxGSD9dJnlC6ioOp5S8PMfkbaLxrY0Z1WEU14aWnvdNKcXLl7/MvqR97Evax2ebP+P/evwfYCz8LTgHBRVf+JsXBeLNP3aTkJoJwPDuzZl4bXsa1/Utd7uVjatHUKXRHDha4HOctayYglJKjQfGQ80LKaLRXKwsO7qMWXtm4Wny5P1B71Pft36pD2x7Iw6fQC9WHV/D27v/4ukzBRbE+9aDoLZQPxTqhYBfIPjUBR+rG7XkQm42pJ+Bc6eYnLKC8Z8tIT3LUqh9kwKLgH+gD/VubcigmwbyaI9HcRR/b39e7fcqY34fQ9SOKIaYhxAWFJbvCFFZXnwbjyTx0i872XI0GYDwFvV44caOdAupX672nIqtiamq3IBQYLudY78C/Qp8XgT0LK1Nd3WS0DgH/d3WTBLPJ8qAmQMkLCpMvt32baFj0dHRYjabRSklZrNZoqOjCx0r6sTg54W8ensd6Ta1k4RFhcnseXeJbJsrknhQpIjjgiNER0dLYGBgMccFLy8lweODZcA3HeTEO21EFj4vcnp/mdp+e93bEhYVJjf/eLNk5WSVWTZ7nEg5L/83c1O+A8Slr/4lc/89Krm5Zb/+guRacissG+7oJOEA8UCLAp+DrWUajaaG8+HGDzmTcYZLm1zK2E5jCx2LiIggNjYWi8VCbGzshdHE2WNEND3ElGH+mAMUCjAHKKbc05NJT33C8z0eB+C11J3829AMDVpCOZZ2RERE4O9f3HkgO1s4Ofckb2b50Tg1AVZ+AB93h+/uhKPrHWp7QrcJmOua2Z+8P989vSJkZOfy6ZL9DH5nKfM2xePtYeI/g1uz5PFBDO8ejMlU9uvPteTy5/4/uXPOnfSf2r/CMtrD3U18PwMTlFIzMZwjUqQazj9pNJqyseP0Dubvm4+n8uS53s9hUqW8S5/eB8vfgW0/gOQScQlEDOgD3cdAp1vAvxEANwN7MxKYsXMGjy59lNvP3c47L79TLtOZvbmu7DPZ9L5/PRxdBxunwfa5sPd3YwvtD4MngbmP3XZ9PX15rvdz3LvwXr7c8iXXhl5LSN2yT1uICH/uOMHkBbs4euY8ANd2asIzQzsQEuhXytm22XN6D1Gbo5i+dTrHUo8BoFAcTDpIq/qtytVmSbhUQSmlvgcGAUFKqTjgBcALQES+ABYAQ4H9QDowzjWSajSaqsIiFl5f9zqCMKrjKFoGtLRf+dQeWP62oQTEYnjcdbwZLhsP5sttjo4e7fEo+5P28/vc33lk2iP5LutlXQBr17uuRYjRb0gvY7vqJVjzGaz/GmJXwNRrocONRnlga5tt92rai2Gth/HzgZ95ec3LfDXkqzIt4t9yNJnJv+1iXewZAC5pXIfnb+xI3zZBDreRR0pGCrN2zCJqcxSr41bnl7eu35rI8EjGdB1DSIBz5v11sFhNtUd/tzWLXw78wjP/PEOgbyC/3vIr/t421uGkJcDiV2HTDEMxmTwhPAL6P2o4O5RCSmYKTYKbkHE6o9gxs9lMbGxsqW0UjfAAUMuvFl9N+cq2gstIgVWfwKqPIee8IXOfCTBwIngXH9EkZSQx7MdhJGcm81q/17ix9Y125chzoGjWPJiwm+5nt384AA1qe/N/V7Vl5GUheHo4PqOTa8ll8aHFRG2JYt6ueWTkGPfJ39ufER1HMK7bOPq26FtpkW/sBYt1uZOEMzZ3dZKoXbu2iIjEx8fLrbfe6mJpXM/nn38u06ZNq3A77vDdaiqHtKw0GTxrsIRFhcn8ffOLV8g6L7L8XZHJzUVeqCvyUgORnx8WSTpc5r6UUjYjNCilHG7jgTcfEK9ALwGkaXDTQs4adkmJF/nxIZEXAoxr+KCLyP5FNqvO3zdfwqLCpP/3/SXpfFKx47YcQpSnjzQe9oS8tmCnpJwvm5PF3tN7ZdKiSdLivRbCi+Rvg6MGy/TN0yUtM61M7TkKdpwkXK5MnLG5u4KqCrKzs8t1zBEsFovk5lbcc6eycIfvVlM5vLfhPQmLCpORv44s7h22f7HxMH+hrrHFjBA5tbfcfTkSQqgkb8FlR5dJ12ldJSwqTH4/+HvZBTi6XuTTPheu5+eHRTLPFapisVgk8vdICYsKk+dXPl+siZCQEJvX0Dy4hcNipGSkyNf/fi39vu1XSCm1/KClvLjkRTmUdKjs11ZGtIJyg4dYnoI6dOiQdOrUSUREpk6dKrfccotcc8010qZNG3niiSfy6//555/Su3dv6datm9x2222SmmrExHrppZekZ8+e0qlTJ7nvvvvy43sNHDhQHn74YenRo4e88847hfp+4YUXZNSoUXL55ZfLnXfeKQkJCTJ8+HDp2bOn9OzZU/75x4gBlpCQIFdddZV07NhR7rnnHgkJCZFTp07JoUOHpF27djJ69Gjp2LGjxMbGyltvvSU9e/aUzp07y/PPG/88aWlpMnToUOnSpYt06tRJZs6cKSIiEydOlA4dOkjnzp3lsccey5fp7bffFhGRTZs2Sa9evaRz585y8803y5kzZ/Kv6cknn5RLL71U2rZtK8uXLy92X93hu73YKelB7iixKbESPj1cwqLC5PXPX7/QXotgiX7kygsP8k96GcqqEmQuOvrw8fXJl92mu7o15t+q+FXSfXp3CYsKkw///bD8QuRkiSx/R+TlIOPaPu4pcmxLoSoHkg9It+ndJCwqTNYfX59fvnRPgkD5RoG5llxZdHCRjJ43Wvwm++UrpdqTa0vkj5Gy9NDSSnEfdxStoAo8xAq+JVTmVhr2FFTLli0lOTlZzp8/LyEhIXLkyBE5deqU9O/fX9LSjCH1G2+8IS+99JKIiCQmJua3OWrUKPn5559FxHiYP/jggzb7fuGFF6R79+6Snp4uIiIjR46UFStWiIjI4cOHpX379iIi8p///Edee+01ERH5/fffBchXUEopWb16tYgYyjNPOebm5sr1118vy5Ytkzlz5si9996b329ycrKcPn1a2rVrl69Ik5KS8mXKU1CdO3eWpUuXiojIc889Jw8//HD+NT366KMiIvLbb7/JlVdeWezatIJyLSU9yMvCf/7+j7H+5/mbba5jir61jvEwr8S1QXmKFYV4BXpJ8Phg+Xjjx5JrybU7wmrYrKH0mNFDwqLC5JXVrxQLAFsujm8V+fhSQ0m9HCSy5otC67M+3fSphEWFyY3zb5Ttx07LmG/Winnir+JRt2GZAskeOHNAnl/8vJjfNxd6dg2cOlCmbpoqqZnODwxrC3sKyt3XQV0UXHnllQQEBODr60vHjh05fPgwa9asYefOnfTt25fw8HCmTZuW7zG0ZMkSevXqRefOnVm8eDE7dlyITXbHHXfY7WfYsGHUqlULgL///psJEyYQHh7OsGHDOHv2LGlpafzzzz/ceeedAFx77bXUr39hdbnZbKZ3794ALFy4kIULF9KtWze6d+/O7t272bdvH507d+avv/5i4sSJrFixgoCAgPxru+eee5g3bx5+foUnhFNSUkhOTmbgwIGAkbhx+fLl+ceHDx8OQI8ePRyavNZULbaCp+YFb3WU5XHLWRa3jNpetdkwdUPx9rJh0to60P8xIy5eJZG3nkoswtfLvqZB3wa8+cWb1G1S16aHHsCpY6fIzM1kRLsRPNPrmcpxFGjSGcYvhZ73QG4W/P4k/PgQZBvOCfd0vodg/xAOpRxieMxklu09RR0fT8b89+li/09FwyClZaURtTmKgVEDaf1Ra15e/jKHUw5jDjDz/IDn2f/f/SyNXEpkeKRthxQX4u7roJyCvOBenos+PheyaXp4eJCTk4OIMGTIEL7//vtCdTMyMnjooYfYsGEDLVq04MUXXyQj44InUu3ate32U/CYxWJhzZo1+Po6Hner4PkiwtNPP839999frN7GjRtZsGABzz77LFdeeSXPP/8869atY9GiRcyZM4dPPvmExYsXO9xv3v3Juzca96Ki0bazc7N5e/3bADzY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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "# d=5\n",
    "#放置画布\n",
    "fig, ax1 = plt.subplots(1)\n",
    "ds = [2,5,20]\n",
    "#和上面展示一致的建模流程\n",
    "for d in ds:\n",
    "    LinearR = LinearRegression().fit(X, y)\n",
    "    X_ = PF(degree=d).fit_transform(X)\n",
    "    LinearR_ = LinearRegression().fit(X_, y)\n",
    "    line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)\n",
    "    line_ = PF(degree=d).fit_transform(line)\n",
    "    ax1.plot(line, LinearR_.predict(line_), linewidth=2,label=d)\n",
    "\n",
    "#将测试数据带入predict接口，获得模型的拟合效果并进行绘制\n",
    "ax1.plot(line, LinearR.predict(line), linewidth=2, color='green'\n",
    ",label=\"linear regression\")\n",
    "#将原数据上的拟合绘制在图像上\n",
    "ax1.plot(X[:, 0], y, 'o', c='k')\n",
    "#其他图形选项\n",
    "ax1.legend(loc=\"best\")\n",
    "ax1.set_ylabel(\"Regression output\")\n",
    "ax1.set_xlabel(\"Input feature\")\n",
    "ax1.set_title(\"Linear Regression ordinary vs poly\")\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "#来一起鼓掌，感叹多项式回归的神奇"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 多项式回归的可解释性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:28:53.921648Z",
     "start_time": "2021-01-21T09:28:53.908683Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['1',\n",
       " 'x0',\n",
       " 'x1',\n",
       " 'x2',\n",
       " 'x0^2',\n",
       " 'x0 x1',\n",
       " 'x0 x2',\n",
       " 'x1^2',\n",
       " 'x1 x2',\n",
       " 'x2^2',\n",
       " 'x0^3',\n",
       " 'x0^2 x1',\n",
       " 'x0^2 x2',\n",
       " 'x0 x1^2',\n",
       " 'x0 x1 x2',\n",
       " 'x0 x2^2',\n",
       " 'x1^3',\n",
       " 'x1^2 x2',\n",
       " 'x1 x2^2',\n",
       " 'x2^3',\n",
       " 'x0^4',\n",
       " 'x0^3 x1',\n",
       " 'x0^3 x2',\n",
       " 'x0^2 x1^2',\n",
       " 'x0^2 x1 x2',\n",
       " 'x0^2 x2^2',\n",
       " 'x0 x1^3',\n",
       " 'x0 x1^2 x2',\n",
       " 'x0 x1 x2^2',\n",
       " 'x0 x2^3',\n",
       " 'x1^4',\n",
       " 'x1^3 x2',\n",
       " 'x1^2 x2^2',\n",
       " 'x1 x2^3',\n",
       " 'x2^4',\n",
       " 'x0^5',\n",
       " 'x0^4 x1',\n",
       " 'x0^4 x2',\n",
       " 'x0^3 x1^2',\n",
       " 'x0^3 x1 x2',\n",
       " 'x0^3 x2^2',\n",
       " 'x0^2 x1^3',\n",
       " 'x0^2 x1^2 x2',\n",
       " 'x0^2 x1 x2^2',\n",
       " 'x0^2 x2^3',\n",
       " 'x0 x1^4',\n",
       " 'x0 x1^3 x2',\n",
       " 'x0 x1^2 x2^2',\n",
       " 'x0 x1 x2^3',\n",
       " 'x0 x2^4',\n",
       " 'x1^5',\n",
       " 'x1^4 x2',\n",
       " 'x1^3 x2^2',\n",
       " 'x1^2 x2^3',\n",
       " 'x1 x2^4',\n",
       " 'x2^5']"
      ]
     },
     "execution_count": 182,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "from sklearn.linear_model import LinearRegression\n",
    "X = np.arange(9).reshape(3, 3)\n",
    "X\n",
    "poly = PolynomialFeatures(degree=5).fit(X)\n",
    "#重要接口get_feature_names\n",
    "poly.get_feature_names()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:34:03.641184Z",
     "start_time": "2021-01-21T09:34:03.599297Z"
    }
   },
   "outputs": [],
   "source": [
    "from sklearn.datasets import fetch_california_housing as fch\n",
    "import pandas as pd\n",
    "housevalue = fch()\n",
    "X = pd.DataFrame(housevalue.data)\n",
    "y = housevalue.target\n",
    "housevalue.feature_names\n",
    "X.columns = [\"住户收入中位数\",\"房屋使用年代中位数\",\"平均房间数目\"\n",
    ",\"平均卧室数目\",\"街区人口\",\"平均入住率\",\"街区的纬度\",\"街区的经度\"]\n",
    "poly = PolynomialFeatures(degree=2,interaction_only=False,include_bias=True).fit(X,y)\n",
    "poly.get_feature_names(X.columns)\n",
    "X_ = poly.transform(X)\n",
    "#在这之后，我们依然可以直接建立模型，然后使用线性回归的coef_属性来查看什么特征对标签的影响最大\n",
    "reg = LinearRegression().fit(X_,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:34:04.096966Z",
     "start_time": "2021-01-21T09:34:04.086993Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6832976293317493"
      ]
     },
     "execution_count": 200,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg.score(X_,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:34:05.717634Z",
     "start_time": "2021-01-21T09:34:05.696690Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('1', 5.919541228493821e-08),\n",
       " ('住户收入中位数', -11.243025196010601),\n",
       " ('房屋使用年代中位数', -0.8488985432027306),\n",
       " ('平均房间数目', 6.44105896978538),\n",
       " ('平均卧室数目', -31.59132872067673),\n",
       " ('街区人口', 0.0004060903550653467),\n",
       " ('平均入住率', 1.0038623382796663),\n",
       " ('街区的纬度', 8.705681885009069),\n",
       " ('街区的经度', 5.880632723885297),\n",
       " ('住户收入中位数^2', -0.031308127085547366),\n",
       " ('住户收入中位数 房屋使用年代中位数', 0.0018599468360395756),\n",
       " ('住户收入中位数 平均房间数目', 0.043302046573948746),\n",
       " ('住户收入中位数 平均卧室数目', -0.18614227733973562),\n",
       " ('住户收入中位数 街区人口', 5.728315565018208e-05),\n",
       " ('住户收入中位数 平均入住率', -0.002590195101559781),\n",
       " ('住户收入中位数 街区的纬度', -0.1525057126600317),\n",
       " ('住户收入中位数 街区的经度', -0.14424293941290797),\n",
       " ('房屋使用年代中位数^2', 0.0002117253358468724),\n",
       " ('房屋使用年代中位数 平均房间数目', -0.0012621901259268912),\n",
       " ('房屋使用年代中位数 平均卧室数目', 0.010611505790241088),\n",
       " ('房屋使用年代中位数 街区人口', 2.8188528254176445e-06),\n",
       " ('房屋使用年代中位数 平均入住率', -0.0018171694608940631),\n",
       " ('房屋使用年代中位数 街区的纬度', -0.010069037159489796),\n",
       " ('房屋使用年代中位数 街区的经度', -0.009999501677237402),\n",
       " ('平均房间数目^2', 0.007269477294046834),\n",
       " ('平均房间数目 平均卧室数目', -0.0689064341335576),\n",
       " ('平均房间数目 街区人口', -6.823659243457301e-05),\n",
       " ('平均房间数目 平均入住率', 0.02688788415052178),\n",
       " ('平均房间数目 街区的纬度', 0.0875089875467648),\n",
       " ('平均房间数目 街区的经度', 0.08228903378339014),\n",
       " ('平均卧室数目^2', 0.1601809502471593),\n",
       " ('平均卧室数目 街区人口', 0.0005142642675528803),\n",
       " ('平均卧室数目 平均入住率', -0.08719114701422158),\n",
       " ('平均卧室数目 街区的纬度', -0.43704299179127637),\n",
       " ('平均卧室数目 街区的经度', -0.40415057692135165),\n",
       " ('街区人口^2', 2.7377974548883485e-09),\n",
       " ('街区人口 平均入住率', 1.9142676165618434e-05),\n",
       " ('街区人口 街区的纬度', 2.2952978918389674e-05),\n",
       " ('街区人口 街区的经度', 1.4656773312069155e-05),\n",
       " ('平均入住率^2', 8.715609781719009e-05),\n",
       " ('平均入住率 街区的纬度', 0.021334459219551034),\n",
       " ('平均入住率 街区的经度', 0.016241293829120883),\n",
       " ('街区的纬度^2', 0.061886735773105675),\n",
       " ('街区的纬度 街区的经度', 0.10810717324382299),\n",
       " ('街区的经度^2', 0.03990773507955892)]"
      ]
     },
     "execution_count": 201,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coef = reg.coef_\n",
    "[*zip(poly.get_feature_names(X.columns),reg.coef_)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:34:09.011830Z",
     "start_time": "2021-01-21T09:34:08.988890Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>coef</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>平均卧室数目</td>\n",
       "      <td>-31.5913</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>住户收入中位数</td>\n",
       "      <td>-11.243</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>房屋使用年代中位数</td>\n",
       "      <td>-0.848899</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>平均卧室数目 街区的纬度</td>\n",
       "      <td>-0.437043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>平均卧室数目 街区的经度</td>\n",
       "      <td>-0.404151</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>住户收入中位数 平均卧室数目</td>\n",
       "      <td>-0.186142</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>住户收入中位数 街区的纬度</td>\n",
       "      <td>-0.152506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>住户收入中位数 街区的经度</td>\n",
       "      <td>-0.144243</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>平均卧室数目 平均入住率</td>\n",
       "      <td>-0.0871911</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>平均房间数目 平均卧室数目</td>\n",
       "      <td>-0.0689064</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>住户收入中位数^2</td>\n",
       "      <td>-0.0313081</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>房屋使用年代中位数 街区的纬度</td>\n",
       "      <td>-0.010069</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>房屋使用年代中位数 街区的经度</td>\n",
       "      <td>-0.0099995</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>住户收入中位数 平均入住率</td>\n",
       "      <td>-0.0025902</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>房屋使用年代中位数 平均入住率</td>\n",
       "      <td>-0.00181717</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>房屋使用年代中位数 平均房间数目</td>\n",
       "      <td>-0.00126219</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>平均房间数目 街区人口</td>\n",
       "      <td>-6.82366e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>街区人口^2</td>\n",
       "      <td>2.7378e-09</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>5.91954e-08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>房屋使用年代中位数 街区人口</td>\n",
       "      <td>2.81885e-06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>街区人口 街区的经度</td>\n",
       "      <td>1.46568e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>街区人口 平均入住率</td>\n",
       "      <td>1.91427e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>街区人口 街区的纬度</td>\n",
       "      <td>2.2953e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>住户收入中位数 街区人口</td>\n",
       "      <td>5.72832e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>平均入住率^2</td>\n",
       "      <td>8.71561e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>房屋使用年代中位数^2</td>\n",
       "      <td>0.000211725</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>街区人口</td>\n",
       "      <td>0.00040609</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>平均卧室数目 街区人口</td>\n",
       "      <td>0.000514264</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>住户收入中位数 房屋使用年代中位数</td>\n",
       "      <td>0.00185995</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>平均房间数目^2</td>\n",
       "      <td>0.00726948</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>房屋使用年代中位数 平均卧室数目</td>\n",
       "      <td>0.0106115</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41</th>\n",
       "      <td>平均入住率 街区的经度</td>\n",
       "      <td>0.0162413</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>平均入住率 街区的纬度</td>\n",
       "      <td>0.0213345</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>平均房间数目 平均入住率</td>\n",
       "      <td>0.0268879</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>街区的经度^2</td>\n",
       "      <td>0.0399077</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>住户收入中位数 平均房间数目</td>\n",
       "      <td>0.043302</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>街区的纬度^2</td>\n",
       "      <td>0.0618867</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>平均房间数目 街区的经度</td>\n",
       "      <td>0.082289</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>平均房间数目 街区的纬度</td>\n",
       "      <td>0.087509</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>街区的纬度 街区的经度</td>\n",
       "      <td>0.108107</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>平均卧室数目^2</td>\n",
       "      <td>0.160181</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>平均入住率</td>\n",
       "      <td>1.00386</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>街区的经度</td>\n",
       "      <td>5.88063</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>平均房间数目</td>\n",
       "      <td>6.44106</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>街区的纬度</td>\n",
       "      <td>8.70568</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              feature         coef\n",
       "4              平均卧室数目     -31.5913\n",
       "1             住户收入中位数      -11.243\n",
       "2           房屋使用年代中位数    -0.848899\n",
       "33       平均卧室数目 街区的纬度    -0.437043\n",
       "34       平均卧室数目 街区的经度    -0.404151\n",
       "12     住户收入中位数 平均卧室数目    -0.186142\n",
       "15      住户收入中位数 街区的纬度    -0.152506\n",
       "16      住户收入中位数 街区的经度    -0.144243\n",
       "32       平均卧室数目 平均入住率   -0.0871911\n",
       "25      平均房间数目 平均卧室数目   -0.0689064\n",
       "9           住户收入中位数^2   -0.0313081\n",
       "22    房屋使用年代中位数 街区的纬度    -0.010069\n",
       "23    房屋使用年代中位数 街区的经度   -0.0099995\n",
       "14      住户收入中位数 平均入住率   -0.0025902\n",
       "21    房屋使用年代中位数 平均入住率  -0.00181717\n",
       "18   房屋使用年代中位数 平均房间数目  -0.00126219\n",
       "26        平均房间数目 街区人口 -6.82366e-05\n",
       "35             街区人口^2   2.7378e-09\n",
       "0                   1  5.91954e-08\n",
       "20     房屋使用年代中位数 街区人口  2.81885e-06\n",
       "38         街区人口 街区的经度  1.46568e-05\n",
       "36         街区人口 平均入住率  1.91427e-05\n",
       "37         街区人口 街区的纬度   2.2953e-05\n",
       "13       住户收入中位数 街区人口  5.72832e-05\n",
       "39            平均入住率^2  8.71561e-05\n",
       "17        房屋使用年代中位数^2  0.000211725\n",
       "5                街区人口   0.00040609\n",
       "31        平均卧室数目 街区人口  0.000514264\n",
       "10  住户收入中位数 房屋使用年代中位数   0.00185995\n",
       "24           平均房间数目^2   0.00726948\n",
       "19   房屋使用年代中位数 平均卧室数目    0.0106115\n",
       "41        平均入住率 街区的经度    0.0162413\n",
       "40        平均入住率 街区的纬度    0.0213345\n",
       "27       平均房间数目 平均入住率    0.0268879\n",
       "44            街区的经度^2    0.0399077\n",
       "11     住户收入中位数 平均房间数目     0.043302\n",
       "42            街区的纬度^2    0.0618867\n",
       "29       平均房间数目 街区的经度     0.082289\n",
       "28       平均房间数目 街区的纬度     0.087509\n",
       "43        街区的纬度 街区的经度     0.108107\n",
       "30           平均卧室数目^2     0.160181\n",
       "6               平均入住率      1.00386\n",
       "8               街区的经度      5.88063\n",
       "3              平均房间数目      6.44106\n",
       "7               街区的纬度      8.70568"
      ]
     },
     "execution_count": 202,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#放到dataframe中进行排序\n",
    "coeff = pd.DataFrame([poly.get_feature_names(X.columns),reg.coef_.tolist()]).T\n",
    "coeff.columns = [\"feature\",\"coef\"]\n",
    "coeff.sort_values(by=\"coef\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:30:05.448841Z",
     "start_time": "2021-01-21T09:30:04.755694Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "R2:0.7451918143332275\n",
      "time:0.6143589019775391\n"
     ]
    }
   ],
   "source": [
    "#顺便可以查看一下多项式变化之后，模型的拟合效果如何了\n",
    "poly = PolynomialFeatures(degree=4).fit(X,y)\n",
    "X_ = poly.transform(X)\n",
    "reg = LinearRegression().fit(X,y)\n",
    "reg.score(X,y)\n",
    "from time import time\n",
    "time0 = time()\n",
    "reg_ = LinearRegression().fit(X_,y)\n",
    "print(\"R2:{}\".format(reg_.score(X_,y)))\n",
    "print(\"time:{}\".format(time()-time0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-21T09:30:18.798158Z",
     "start_time": "2021-01-21T09:30:07.430544Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "R2:0.9742290565862681\n",
      "time:11.334702014923096\n"
     ]
    }
   ],
   "source": [
    "#假设使用其他模型？\n",
    "from sklearn.ensemble import RandomForestRegressor as RFR\n",
    "time0 = time()\n",
    "print(\"R2:{}\".format(RFR(n_estimators=100).fit(X,y).score(X,y)))\n",
    "print(\"time:{}\".format(time()-time0))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.0"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
